面试经典150题【111-120】

文章目录

  • 面试经典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 valuepublic 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.hqwc.cn/news/571957.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Profinet转ModbusTCP:从站设备转换与集成案例

本案例旨在探讨如何将Modbus TCP设备数据成功地接入到西门子PROFINET网络中。为了实 现这一目标&#xff0c;我们将使用西门子S7-1200型PLC以及耐特森Profinet转ModbusTCP网关作为 关键设备。为了模拟Modbus从站&#xff0c;我们将使用电脑安装modbus poll软件。首先需要了解Pr…

VLAN的原理及配置

文章目录 一、VLAN的概述1、VLAN的概念2、VLAN的优势 二、静态VLAN三、静态VLAN的配置1.VLAN的范围2.VLAN基本配置 四、Trunk和access的作用参考 一、VLAN的概述 1、VLAN的概念 VLAN就是将网络从逻辑上划分为若按个小的网络&#xff0c;也就是虚拟局域网。 2、VLAN的优势 使…

逐步学习Go-并发通道chan(channel)

概述 Go的Routines并发模型是基于CSP&#xff0c;如果你看过七周七并发&#xff0c;那么你应该了解。 什么是CSP&#xff1f; "Communicating Sequential Processes"&#xff08;CSP&#xff09;这个词组的含义来自其英文直译以及在计算机科学中的使用环境。 CSP…

今日AI热点:科技前沿新动态

引言&#xff1a; 人工智能领域日新月异&#xff0c;每天都有令人振奋的新进展。从苹果到谷歌&#xff0c;从OpenAI到Meta&#xff0c;各大科技巨头纷纷推出创新产品和技术&#xff0c;不断推动着人工智能的发展。让我们一起来看看今日AI热点&#xff0c;探索这个充满活力和激情…

软件测试技术之登录页面测试用例的设计方法

相信大家都有过写登录测试用例的经验&#xff0c;相较于开发人员编写代码而言&#xff0c;测试人员编写用例同样重要。本文作者总结了一些关于登录用例的经验。 一、功能测试用例设计&#xff1a; 1、正常登录场景 测试用例1&#xff1a;输入正确的用户名和密码&#xff0c;验证…

rmvb怎么转换为mp4?最简单方法!

各种文件格式层出不穷&#xff0c;而RMVB&#xff08;RealMedia Variable Bitrate&#xff09;格式作为一种独特的视频文件格式&#xff0c;其起源可以追溯到上世纪90年代。当时&#xff0c;随着数字视频的崛起&#xff0c;RealNetworks公司迎来了一项重要任务&#xff1a;提供…

20240320-1-梯度下降

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

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

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

【王道训练营】第3题 判断某个年份是不是闰年,如果是闰年,请输出“yes”,否则请输出“no”

文章目录 引言闰年初始代码代码改进改进1&#xff1a;添加提示信息改进2&#xff1a;代码格式改进3&#xff1a;变量命名 其他实现方式使用if-else语句使用函数使用三元操作符 结论 引言 在公历中&#xff0c;闰年的规则如下&#xff1a;如果某个年份能被4整除但不能被100整除…

拥抱C++的深度和复杂性,挖掘更多可能 !——《C++20高级编程(第5版)》

&#xff0c;C难以掌握&#xff0c;但其广泛的功能使其成为游戏和商业软件应用程序中最常用的语言。即使是有经验的用户通常也不熟悉许多高级特性&#xff0c;但C20的发布提供了探索该语言全部功能的绝佳机会。《C20高级编程(第5版)》为C的必要内容提供了一个代码密集型、面向解…

docker centos7在线安装Nginx

目录 1.在线安装Nginx2.配置开机启动 1.在线安装Nginx # 安装Nginx yum install epel-release yum install nginx2.配置开机启动 # 启动Nginx systemctl start nginx # 开机自启 systemctl enable nginx一般docker内的centos7安装Nginx的目录结构是&#xff1a; /etc/nginx为…

系统工程学思想

系统工程学思想 大项目或复杂问题的实施和解决&#xff0c;需要按照系统工程学理论进行&#xff0c;以系统的方法完整、全面的分析&#xff0c;而不是零星的处理问题&#xff0c;沿着逻辑推理的路径&#xff0c;去解决哪些原本靠直觉判断处理的问题。 系统分析过程逻辑结构分为…