面试经典150题【111-120】

news2024/11/15 20:10:50

文章目录

  • 面试经典150题【111-120】
    • 67.二进制求和
    • 190.颠倒二进制位
    • 191.位1的个数
    • 136.只出现一次的数字
    • 137.只出现一次的数字II
    • 201.数字范围按位与
    • 5.最长回文子串
    • 97.交错字符串
    • 72.编辑距离
    • 221.最大正方形

面试经典150题【111-120】

六道位运算,四道二维dp

67.二进制求和

在这里插入图片描述

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder str = new StringBuilder();
        int carry = 0;
        for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
            int sum = carry;
            sum += i >= 0 ? a.charAt(i) - '0' : 0;
            sum += j >= 0 ? b.charAt(j) - '0' : 0;
            str.append(sum % 2);
            carry = sum / 2;
        }
        // 最后一位还没加
        if (carry == 1)
            str.append(carry);
        return str.reverse().toString();
    }
}

从后往前一位一位算,每一位为sum(进位,a,b)。

190.颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。

public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int ans = 0;
        for (int i = 0; i < 32; i++) {
            ans |= (n & 1) << (31 - i);
            n = n >>> 1;
        }
        return ans;
    }
}

二进制的一些处理方法。 ans |= (n & 1) << (31 - i) 对某一位进行填充。

191.位1的个数

在这里插入图片描述
n = n&(n-1) 将n的最后一个1给消除掉
n =100
n-1 = 011
则n &(n-1) = 000

class Solution {
    public int hammingWeight(int n) {
        int ans=0;
        while(n!=0){
            n = n&(n-1);
            ans++;
        }
        return ans;
    }
}

136.只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
所有元素依次亦或即可

137.只出现一次的数字II

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

class Solution {
    public int singleNumber(int[] nums) {
        int[] count=new int[32];
        int res=0;
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<32;j++){
                count[j] += nums[i]&1;
                nums[i] >>>=1;
            }
        }
        for(int i=0;i<32;i++){
            res |= (count[i]%3)<<i;
        }
        return res;

    }
}

定义一个32位长度的数组,将每个数字的二进制位填入数组中,比如101,填入数组的第一位和第三位。
则对于2,2,2,3这种。10,10,10,101
count数组的内容为 1,3,1
然后所有的内容都对3取余,这样就可以消除所有的出现三次的数字
count的内容为1,0,1.
就可以筛选出3来了。

201.数字范围按位与

给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。
按位与, 0&0=0, 0&1=0, 1&1=1
在这里插入图片描述
所以其本质就是寻找最长的相同前缀。
M是很大的,N是很小的。我不停的消除掉M最右边的1,直到把红色的部分全部消除完。这样M就会小于等于N了。

public int rangeBitwiseAnd(int left, int right) {
        while(left<right){
            right = right & (right-1);
        }
        return right;

    }

5.最长回文子串


最标准的就是中心扩散,这样是O(N^2),也可以用二维数组记录一下状态,减少一些搜索量。

class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() < 2) {
            return s;
        }
        int strLen = s.length();
        int maxStart = 0;  //最长回文串的起点
        int maxEnd = 0;    //最长回文串的终点
        int maxLen = 1;  //最长回文串的长度
        boolean[][] dp=new boolean[strLen][strLen];

        for(int j=0;j<strLen;j++){
            for(int i=0;i<j;i++){
                if(s.charAt(i)==s.charAt(j) &&(j-i<=2 || dp[i+1][j-1])){
                    dp[i][j]=true;
                    if(j-i+1 >maxLen){
                        maxLen=j-i+1;
                        maxStart=i;
                        maxEnd=j;
                    }
                }
            }
        }
        return s.substring(maxStart,maxEnd+1);

    }
}

97.交错字符串

在这里插入图片描述
在这里插入图片描述
dp[i][j] 表示 由s1的前i个字符 和 s2 的前j个字符,能不能组成s3的前 i+j 个字符。
建立数组的时候长度要加一,不然直接dp[0][0]为s1前1个字符和s2前1个字符能不能组成s3的前2个字符,这显然是不合适的。
如果空出来第一列和第一行就很合适了。比如就是说s1的0个字符和s2的N个字符,只需要考虑s2即可。

class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        if(s1.length()+s2.length() != s3.length()) return false;
        boolean[][] ans = new boolean[s1.length() + 1][s2.length() + 1];
        ans[0][0] = true;
        for (int i = 1; i < s1.length() + 1; i++) {
            ans[i][0] = ans[i - 1][0] && (s3.charAt(i - 1) == s1.charAt(i - 1));
        }
        for (int j = 1; j < s2.length() + 1; j++) {
            ans[0][j] = ans[0][j - 1] && (s3.charAt(j - 1) == s2.charAt(j - 1));
        }
        for (int i = 1; i < s1.length() + 1; i++) {
            for (int j = 1; j < s2.length() + 1; j++) {
                ans[i][j] = (ans[i - 1][j] && (s3.charAt(i + j - 1) == s1.charAt(i - 1)))
                        || (ans[i][j - 1] && (s3.charAt(i + j - 1) == s2.charAt(j - 1)));
            }
        }
        return ans[s1.length()][s2.length()];

    }
}

72.编辑距离

在这里插入图片描述
dp[i][j]代表将word1的前i个字符转换为word2的前j个字符所需要的转换次数。
其中,dp[i-1][j-1] 表示替换操作,dp[i-1][j] 表示删除操作,dp[i][j-1] 表示插入操作。
注意,针对第一行,第一列要单独考虑,我们引入 ‘’ 下图所示:
在这里插入图片描述

    public int minDistance(String word1, String word2) {
        int[][] dp=new int[word1.length()+1][word2.length()+1];
        for(int i=0;i<word1.length()+1;i++){
            dp[i][0]=i;
        }
        for(int j=0;j<word2.length()+1;j++){
            dp[0][j]=j;
        }
        for(int i=1;i<word1.length()+1;i++){
            for(int j=1;j<word2.length()+1;j++){
                if(word1.charAt(i-1)==word2.charAt(j-1)) dp[i][j]=dp[i-1][j-1];
                //分别对应 添加,删除和替换三种情况
                else dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;

            }
        }
        return dp[word1.length()][word2.length()];
    }

221.最大正方形

在这里插入图片描述
在这里插入图片描述
dp[i][j]表示 以(i,j) 为右下角,能形成的最大的矩阵。

class Solution {
    public int maximalSquare(char[][] matrix) {
        int ans=0;
        int[][] dp=new int[matrix.length+1][matrix[0].length+1];
        for(int i=1;i< matrix.length+1;i++){
            for(int j=1;j<matrix[0].length+1;j++){
                if(matrix[i-1][j-1]=='1'){
                    dp[i][j]=1+Math.min(dp[i-1][j-1],Math.min(dp[i][j-1],dp[i-1][j]));
                    ans=Math.max(ans,dp[i][j]);
                    
                }
            }
        }
        return ans*ans;

    }
}

这边二维dp,特别容易长度加一
int[][] dp=new int[matrix.length+1][matrix[0].length+1];
第一行和第一列用来缓冲,1 到 length 这些索引才是符合题意的,因为要兼容第二行的 i-1,j-1之类的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[HackMyVM]靶场quick5

kali:192.168.56.104 靶机:192.168.56.134 端口扫描 # nmap 192.168.56.134 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-27 19:08 CST Nmap scan report for careers.quick.hmv (192.168.56.134) Host is up (0.000056s latency). Not shown: 998 closed tcp p…

Unity编辑器功能将AB资源文件生成MD5码

将路径Application.dataPath/ArtRes/AB/PC文件夹下所有的Ab包文件生成MD5吗&#xff0c;通过文件名 文件长度MD5‘|’的格式拼接成字符串写入到资源对比文件abCompareInfo.txt中。 将路径pathFile扥文件生成MD5码

C语言学习之环境搭建【建议收藏】

学生时代&#xff0c;我们一般使用的VC【Microsoft Visual C 2010&#xff08;学习版&#xff09;】进行学习&#xff0c;该篇博客主要记录如何安装VC&#xff0c;非常详细&#xff0c;适合入门的小白&#xff0c;奶妈级别安装教程&#xff0c;建议收藏。 准备好软件安装包&…

LeetCode刷题--- Dijkstra 求最短路径

首先是图的表示&#xff0c;邻接矩阵和邻接表。实现看代码 邻接矩阵&#xff1a;二维数组&#xff0c; matrix[a][b] 表示 从a可以指向b无向图而言&#xff0c; matrix[a][b]matrix[b][a]&#xff0c;比如可以定义matrix[a][b]1表示ab是连接的&#xff0c;matrix[a][b]0表示ab…

Docker进阶:Docker Swarm —弹性伸缩调整服务的副本数量

Docker进阶&#xff1a;Docker Swarm —弹性伸缩调整服务的副本数量 1、 创建一个Nginx服务&#xff08;Manager节点&#xff09;2、查看服务状态&#xff08;Manager节点&#xff09;3、测试访问&#xff08;Worker节点&#xff09;4、查看服务日志&#xff08;Manager节点&am…

有效三角形的个数【双指针】

1.优化版暴力求解 如果能构成三⻆形&#xff0c;需要满⾜任意两边之和要⼤于第三边。实际上只需让较⼩的两条边之和⼤于第三边即可。将原数组排序&#xff0c;从⼩到⼤枚举三元组&#xff0c;这样三层 for 循环枚举出的三元组只需判断较⼩的两条边之和是否⼤于第三边。 class…

2024/3/24周报

文章目录 摘要Abstract文献阅读题目引言创新点数据处理研究区域和数据缺失值处理水质相关分析 方法和模型LSTMAttention机制AT-LSTM模型 实验结果 深度学习transformer代码实现1 模型输入1.1 Embedding层1.2 位置编码 2 Encoder2.1 编码器2.2 编码器层2.3注意力机制2.4多头注意…

Sora那么牛,他的模型的成本会有多少呢?

Sora的训练需要大量的计算资源&#xff0c;估计需要4211-10528个 Nvidia H100 GPUs运行一个月。推理成本&#xff1a;一个Nvidia H100 GPU大约每小时能生成5分钟的视频。初期的Sora成本将非常高&#xff0c;肯定是不适合普通人来使用&#xff0c;所以目前OpenAI都是先找一些艺术…

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

用python绘制词云图时&#xff0c;出现报错AttributeError: ImageDraw object has no attribute textsize&#xff0c;应当如何解决&#xff1f; - CSDN文库

TikTok养号怎么做?打破0播放的前提是做好这些

TikTok养号的重要性不必多少&#xff0c;不仅可以在创号初期保障账号安全&#xff0c;后期的账号流量也需要以前期养好账号为前提。下面就给大家分享如何养号的真实操作攻略&#xff01; 一、为什么要养号 &#xff08;1&#xff09;提高系统推荐精准度 系统不了解新账户人设…

基于单片机病房温度监测与呼叫系统设计

**单片机设计介绍&#xff0c;基于单片机病房温度监测与呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房温度监测与呼叫系统设计概要主要涵盖了通过单片机技术实现病房温度的实时监测以及病人呼叫功能…

如何应对Android面试官->进程通信如何注册与获取服务

前言 大家好&#xff0c;我是老A&#xff1b; 这个章节继续上一章节继续讲解&#xff0c;主要讲解下 java 层服务的注册与获取、线程池&#xff1b;我们基于 AMS 来看下 java 层是如何获取的&#xff1b; SystemServer SystemServer 的启动也是 main 函数&#xff0c;我们进入…

三、阅读器开发--4、阅读器目录、全文搜索功能开发

1、阅读器目录 1.1、实现目录 先实现目录的布局 定义一个蒙版&#xff0c;充满整个屏幕浮在阅读器上方&#xff0c;左侧为目录右侧为背景&#xff0c;目录下方包含一个tab&#xff0c;点击后会切换不同的内容&#xff0c;这里tab是目录、书签&#xff0c;这里可以通过如下的…

(原型与原型链)前端八股文修炼Day5

一 原型链的理解 原型链定义&#xff1a; 原型链是 JavaScript 中实现对象继承的关键机制之一&#xff0c;它是一种对象之间的关系&#xff0c;通过这种关系&#xff0c;一个对象可以继承另一个对象的属性和方法。 原型链的组成&#xff1a; 每个对象都有一个指向另一个对象的…

【node】express使用(三)

1、express.static快速托管静态资源 express:快速、开放、极简的Web开发框架。(npm第三方包&#xff0c;提供快速创建web服务器便捷方法) Express中文官网 (1) express快速创建web网站服务器以及api接口服务器 // 1、导入express const express require(express) // 2、创…

ITES | 深圳工业展正运动重磅产品即将亮相

■展会名称&#xff1a; 第二十五届深圳国际工业制造技术及设备展览会&#xff08;以下简称“深圳工业展”&#xff09; ■展会日期 2024年3月28日-31日 ■展馆地点 中国深圳国际会展中心(宝安) ■展位号 9号馆F04 2024年深圳工业展(ITES)将于3月28日至31日在深圳宝安国…

Android Studio详细安装教程及入门测试

Android Studio 是 Android 开发人员必不可少的工具。 它可以帮助开发者快速、高效地开发高质量的 Android 应用。 这里写目录标题 一、Android Studio1.1 Android Studio主要功能1.2 Android应用 二、Android Studio下载三、Android Studio安装四、SDK工具包下载五、新建测试…

20240320-1-梯度下降

梯度下降法面试题 1. 机器学习中为什么需要梯度下降 梯度下降的作用&#xff1a; 梯度下降是迭代法的一种&#xff0c;可以用于求解最小二乘问题。在求解损失函数的最小值时&#xff0c;可以通过梯度下降法来一步步的迭代求解&#xff0c;得到最小化的损失函数和模型参数值。…

阶乘的最高位

阶乘的最高位 题目描述 输入一个正整数n。输出n!的最高位上的数字。 输入 输入一个正整数n&#xff08;n不超过1000&#xff09;。 输出 输出n!的最高位上的数字。 样例输入 1000样例输出 4解 这道题要是求阶乘的后三位或者后几位&#xff0c;大家肯定都会。 求最高…

web服务应用术语

一、HTTP 协议详解 TCP 协议与 HTTP 协议 TCP 协议主要用于数据传输控制&#xff0c;而 HTTP 协议主要用于应用层面的数据交互。 HTTP 属于应用层协议&#xff0c;是建立在 TCP 协议基础之上的&#xff0c;HTTP 协议以客户端请求和服务器端响应为标准&#xff0c;浏览器通常称…