面试经典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.mzph.cn/news/776970.shtml

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

相关文章

PCB损耗来源

信号经过PCB板会产生损耗&#xff0c;主要包括导体损耗&#xff0c;介电损耗和辐射损耗 导体损耗&#xff1a;导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗&#xff1a;介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗&#xff1a;辐…

YOLOv9 实战指南:打造个性化视觉识别利器,从零开始训练你的专属测试集

论文地址&#xff1a;YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information GitHub&#xff1a;WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information (github.com)…

Linux---多线程(下)

前情提要&#xff1a;Linux---多线程(上) 七、互斥 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行&#xff0c;但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

3.28(迭代搜索算法 + java学习总结)

迭代加深搜索 迭代加深算法是一在DFS的基础上添加搜索深度限制的搜索方法&#xff1b; 其核心思想是从深度为0的地方开始搜索&#xff0c;然后逐步加深搜索深度&#xff0c;重新搜索一遍&#xff1b;这对于那些已知答案在浅层&#xff0c;但整个树或图存在极多分支的情况&#…

【前端Vue】HR-saas中台项目开发md文档第1篇:vuex基础-介绍,vuex基础-初始化功能【附代码文档】

HR-saas中台管理项目开发完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vuex基础-介绍,vuex基础-初始化功能,vuex基础-state,vuex基础-mutations,vuex基础-actions,vuex基础-getters。项目课设计&#xff0c;人力资源的环境搭建vue-element-admin的了解和…

[flask]http请求//获取请求头信息+客户端信息

在网站中查询请求头信息&#xff0c;可以通过以下操作进行 右键然后选择检查 进入改页面后选择文档&#xff0c;刷新一下页面就好了 获取所有的请求头信息 print(request.headers, type(request.headers)) 在flask模块中&#xff0c;使用上面的输出函数就可以查看到有关于请求…

Qt 窗口MainWindow(上)

Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自 QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、多个浮动窗口&#xff08;…

第十四届蓝桥杯JavaA组省赛真题 - 特殊日期

解题思路&#xff1a; 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…

安防监控视频汇聚平台EasyCVR启用图形验证码之后如何调用login接口?

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

【Vue】可拖拽侧边栏实现

在本篇博客中&#xff0c;我们将探讨如何在 Vue.js 项目中实现一个可拖拽的侧边栏。此功能可以通过修改 HTML 和 Vue 组件的脚本来实现。 首先&#xff0c;我们需要在 HTML 文件中定义侧边栏的容器和用于拖拽的元素。在 Vue 组件中&#xff0c;我们将使用 Vue 的响应式系统来追…

力扣73. 矩阵置零

Problem: 73. 矩阵置零 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;利用一个等大的矩阵判定 复制一个与原始矩阵一样大的矩阵temp&#xff0c;遍历temp时若temp[i][j] 0&#xff0c;则将martix对应的行与列均设置为0 思路2&#xff1a;利用两个一维矩阵…

【Linux】UnixBench介绍、分数调优思路以及测试2D3D的方法

一.简介 unixbench是一个用于测试unix系统性能的工具&#xff0c;也是一个比较通用的benchmark&#xff0c; 此测试的目的是对类Unix 系统提供一个基本的性能指示&#xff0c;很多测试用于系统性能的不同方面&#xff0c;这些测试的结果是一个指数值&#xff08;index value&am…

幻兽帕鲁服务器价格表_阿里云/腾讯云/京东云/华为云报价大全

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

C++类的六个默认成员函数(详细解析与总结)

目录 前言&#xff1a; 一、构造函数 a.特点 b.注意事项 1.首先明确什么是默认构造函数 2.默认构造函数对内置类型与自定义类型的处理 c.总结 二、析构函数 a.特点 b.注意事项 1.什么时候写析构函数&#xff1f; 2.析构函数对内置类型与自定义类型的处理 c.总结 …

pythonselenium自动化测试实战项目

说明&#xff1a;本项目采用流程控制思想&#xff0c;未引用unittest&pytest等单元测试框架 一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 2.输入格式正确的用户名和不…

【面试经典 | 150】单词拆分

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【字符串】 题目来源 139. 单词拆分 解题思路 方法一&#xff1a;动态规划 定义状态 定义 dp[i] 表示字符串 s 前 i 个字符组成的字符串&#xff08;s[0, ..., i-1]&#xff09;是否能被…

【Node.js】模块化

概述 Nodejs 模块化规范遵循两套规范&#xff1a; Common JSES Module Common JS 引入模块&#xff08;require&#xff09;支持四种格式 支持引入内置模块例如 http os fs child_process 等const fs require(fs)&#xff0c;高版本也可以使用const fs require(node:fs…

【Java SE】封装

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 封装1.1 封装是什么1.2 封装的意义1.3 访问修饰限定符1.3.1 在Java中如何实现封装1.3.2 各种访问修饰限定…

SpringCloud微服务集成Dubbo

1、Dubbo介绍 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服…