面试经典150题【21-30】

文章目录

  • 面试经典150题【21-30】
    • 6.Z字形变换
    • 28.找出字符串中第一个匹配项的下标
    • 68.文本左右对齐
    • 392.判断子序列
    • 167.两数之和
    • 11.盛最多水的容器
    • 15.三数之和
    • 209.长度最小的子数组
    • 3.无重复字符的最长子串
    • 30.串联所有单词的子串

面试经典150题【21-30】

6.Z字形变换

对于“LEETCOD”且参数为3的时候,3代表有三行需要创建三个res数组
在这里插入图片描述

class Solution {public String convert(String s, int numRows) {if(numRows < 2) return s;List<StringBuilder> rows = new ArrayList<StringBuilder>();for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());  //将数组创建且填充完成int i = 0, flag = -1;for(char c : s.toCharArray()) {rows.get(i).append(c);if(i == 0 || i == numRows -1) flag = - flag;  //如果到了最上面或最下面,则方向进行调转。i += flag;  //i决定下一个字母写到第几行}StringBuilder res = new StringBuilder();for(StringBuilder row : rows) res.append(row);return res.toString();}
}

28.找出字符串中第一个匹配项的下标

Sunday算法。
偏移表的作用是存储每一个在 模式串 中出现的字符,在 模式串 中出现的最右位置到尾部的距离 +1+1+1,例如 aab:

a 的偏移位就是 len(pattern)-1 = 2
b 的偏移位就是 len(pattern)-2 = 1
其他的均为 len(pattern)+1 = 4
在这里插入图片描述
要不就是移动到已有的(在Pianyi数组中),要不就是全部移动(移动nSize+1)

public class LC28 {static int strStr(String haystack,String needle){int hSize=haystack.length();int nSize=needle.length();HashMap<Character,Integer> pianyi=new HashMap<Character, Integer>();for(int i=0;i<needle.length();i++){//建立偏移表pianyi.put(needle.charAt(i),nSize-i);}//遍历int i=0;while(i<=hSize-nSize){//判断是否成功if(haystack.substring(i,i+nSize).equals(needle)) return i;else{//判断是否越界if(i+nSize > hSize-1) return -1;else{if(pianyi.containsKey(haystack.charAt(i+nSize))){//匹配,考虑往后移动几下//取最后的下一位字母,来判断应该偏移几位。这样偏移了以后,就满足他离最后还差几位。i+=pianyi.get(haystack.charAt(i+nSize));}else{i+=nSize+1; //不匹配,连这个字母也跳过}}}}return-1;}public static void main(String[] args) {String haystack = "w222sadbutsad", needle = "sad";System.out.println(strStr(haystack,needle));}
}

68.文本左右对齐

模拟题
在这里插入图片描述
三种情况:
1.当前行是最后一行:单词左对齐,且单词之间应只有一个空格,在行末填充剩余空格;
2.当前行不是最后一行,且只有一个单词:该单词左对齐,在行末填充空格;
3.当前行不是最后一行,且不只一个单词。

public class LC68 {@Testpublic void test(){String[] words= {"This", "is", "an", "example", "of", "text", "justification."};int maxWidth=16;List<String> strings = fullJustify(words, maxWidth);for(String s1:strings){System.out.println(s1);}}public List<String> fullJustify(String[] words, int maxWidth) {List<String> ans = new ArrayList<String>();int right = 0, n = words.length;while (true) {int left = right; // 当前行的第一个单词在 words 的位置int sumLen = 0; // 统计这一行单词长度之和// 循环确定当前行可以放多少单词,注意单词之间应至少有一个空格while (right < n && sumLen + words[right].length() + right - left <= maxWidth) {sumLen += words[right++].length();}// 当前行是最后一行:单词左对齐,且单词之间应只有一个空格,在行末填充剩余空格if (right == n) {StringBuilder sb = join(words, left, n, " ");sb.append(blank(maxWidth - sb.length()));ans.add(sb.toString());return ans;}int numWords = right - left;int numSpaces = maxWidth - sumLen;// 当前行只有一个单词:该单词左对齐,在行末填充剩余空格if (numWords == 1) {StringBuffer sb = new StringBuffer(words[left]);sb.append(blank(numSpaces));ans.add(sb.toString());continue;}// 当前行不只一个单词int avgSpaces = numSpaces / (numWords - 1);int extraSpaces = numSpaces % (numWords - 1);StringBuffer sb = new StringBuffer();sb.append(join(words, left, left + extraSpaces + 1, blank(avgSpaces + 1))); // 拼接额外加一个空格的单词sb.append(blank(avgSpaces));sb.append(join(words, left + extraSpaces + 1, right, blank(avgSpaces))); // 拼接其余单词ans.add(sb.toString());}}// blank 返回长度为 n 的由空格组成的字符串public String blank(int n) {StringBuilder sb = new StringBuilder();for (int i = 0; i < n; ++i) {sb.append(' ');}return sb.toString();}// join 返回用 sep 拼接 [left, right) 范围内的 words 组成的字符串public StringBuilder join(String[] words, int left, int right, String sep) {StringBuilder sb = new StringBuilder(words[left]);for (int i = left + 1; i < right; ++i) {sb.append(sep);sb.append(words[i]);}return sb;}
}

#125.验证回文串

先把所有字母放到一个大字符串里(全部放小写字母),然后进行双指针的比较或直接比reverse也行
Character.isLetterOrDigit(ch) //判断是否为数字或字母
Character.toLowerCase(ch) //转小写

392.判断子序列

子序列和子串不一样。
“abc”是"ahbgdc"的子序列

167.两数之和

在这里插入图片描述
可以用双指针,缩减搜索空间。或者空间复杂度高一点做一个哈希表,每次读取了元素之后存到哈希表里。
return new int[]{hashMap.get(target-numbers[i])+1,i+1}

11.盛最多水的容器

在这里插入图片描述
求法就是双指针,面积就是底乘高。height[i]小就i++, height[j]小就j–;
若向内 移动短板 ,水槽的短板min(h[i],h[j]) 可能变大,因此下个水槽的面积 可能增大 。
若向内 移动长板 ,水槽的短板 min(h[i],h[j])​ 不变或变小,因此下个水槽的面积 一定变小

15.三数之和

在这里插入图片描述
先定一个first,然后就是求两数之和,双指针。注意不要重复的数字。

class Solution {public List<List<Integer>> threeSum(int[] nums) {int n = nums.length;Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<List<Integer>>();// 枚举 afor (int first = 0; first < n; ++first) {// 优化1 : 设 s = nums[first] + nums[first+1] + nums[first+2],如果 s >// 0,由于数组已经排序,后面无论怎么选,选出的三个数的和不会比 s 还小,所以只要 s > 0 就可以直接 break 外层循环了。if (first + 2 < n && nums[first] + nums[first + 1] + nums[first + 2] > 0) {return ans;}// 优化2 : 当nums[i] + nums[length - 1] + nums[length - 2] < 0 时,// nums[i]不可能符合条件,i++if (nums[first] + nums[n - 1] + nums[n - 2] < 0) {continue;}// 枚举的数字需要与上一个不同if (first > 0 && nums[first] == nums[first - 1]) {continue;}int third = n - 1;// 定义 b+c的目标位targetint target = -nums[first];// 枚举bfor (int second = first + 1; second < n; second++) {// 枚举数字需要与上一个不同if (second > first + 1 && nums[second] == nums[second - 1]) {continue;}// 两数之和, 对于每一个second,枚举cwhile (second < third && nums[second] + nums[third] > target) {--third;}// 重合了就退出循环if (second == third)break;if (nums[second] + nums[third] == target) {List<Integer> list = new ArrayList<Integer>();list.add(nums[first]);list.add(nums[second]);list.add(nums[third]);ans.add(list);}}}return ans;}
}

209.长度最小的子数组

在这里插入图片描述
正常的话要考虑两个东西,一个是找不到则答案输出为0,还有是因为是Min函数,要考虑ans的初始值。
但是也可以用一个三目运算符搞定。

class Solution {public int minSubArrayLen(int target, int[] nums) {int i=0,sum=0,len=0;for(int j=0;j<nums.length;j++){sum+=nums[j];while(sum>=target){len= len==0? (j-i+1) :Math.min(len,j-i+1);sum-=nums[i++];}}return len;}
}

找不到答案,说明target太大,走不进while循环里。
只要大了,就取当前长度(j-i+1) 与 len 做比较。

3.无重复字符的最长子串

在这里插入图片描述
用set

public class LC3 {public int lengthOfLongestSubstring(String s) {if(s.length() ==0)  return 0;Set<Character> c1=new HashSet<Character>();int left=0,maxStr=0;for(int i=0;i<s.length();i++){while(c1.contains(s.charAt(i))){//因为有abcaad这种情况。所以应该删一次. 并且要将if改为while//移除的是最左边的元素,但是while判断里的是 i元素。c1.remove(s.charAt(left));left++;}maxStr=Math.max(maxStr,i-left+1);c1.add(s.charAt(i));}return maxStr;}
}

用hash

public class LC3 {public int lengthOfLongestSubstring(String s) {if(s.isEmpty())  return 0;Map<Character,Integer> map=new HashMap<>();int maxStr=0,left=0;for(int i=0;i<s.length();i++){if(map.containsKey(s.charAt(i))){//肯定是发生了abca这种,所以要把left从a变到b//left=map.get(s.charAt(i))+1;//如果遇到abba呢,会造成指针回跳,所以要修改//+1应该在括号里,因为有zmmuyrz的情况。答案应该是muyrz五个数。//一般都是走后面的情况,防止指针回跳加了个Max(leftleft=Math.max(left,map.get(s.charAt(i))+1);}map.put(s.charAt(i),i);maxStr=Math.max(maxStr,i-left+1);}return maxStr;}
}

30.串联所有单词的子串

这个滑动窗口太硬了,还是直接暴力吧。用一个hashMap来记录每个单词出现的次数。
在这里插入图片描述

class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> res = new ArrayList<Integer>();int wordNum = words.length;if (wordNum == 0) {return res;}int wordLen = words[0].length();// HashMap1 存所有单词HashMap<String, Integer> allWords = new HashMap<String, Integer>();for (String w : words) {int value = allWords.getOrDefault(w, 0);allWords.put(w, value + 1);}// 遍历所有子串for (int i = 0; i < s.length() - wordNum * wordLen + 1; i++) {// HashMap2 存当前扫描的字符串含有的单词HashMap<String, Integer> hasWords = new HashMap<String, Integer>();int num = 0;// 判断该子串是否符合while (num < wordNum) {String word = s.substring(i + num * wordLen, i + (num + 1) * wordLen);// 判断该单词在 HashMap1 中if (allWords.containsKey(word)) {int value = hasWords.getOrDefault(word, 0);hasWords.put(word, value + 1);// 判断当前单词的 value 和 HashMap1 中该单词的 valueif (hasWords.get(word) > allWords.get(word)) {break;}} else {break;}num++;}// 判断是不是所有的单词都符合条件if (num == wordNum) {res.add(i);}}return res;}}

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

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

相关文章

js滑动窗口算法

滑动窗口算法&#xff08;Sliding Window Algorithm&#xff09;是一种用于解决数组或字符串的子串问题的有效算法。其核心思想是通过维护一个窗口&#xff0c;根据问题的要求移动窗口的左右边界&#xff0c;从而在窗口内部找到符合条件的子串。 一般步骤如下&#xff1a; 初…

仿12306校招项目业务四(乘车人模块)

乘车人表结构 分库分表策略 乘车人的数据严重依赖于用户数据。每个用户至少需要有一个对应的乘车人&#xff0c;即自己本人。当然&#xff0c;也有可能是其他人&#xff0c;因为允许用户注册账号后为他人购票的情况。这种关联确保了用户和乘车人之间的正确映射&#xff0c;使系…

LeetCode | 两数相加 C语言

Problem: 2. 两数相加 文章目录 思路解题方法Code一些感想 思路 主要是一一相加和逆序的方式存储 先说逆序储存&#xff0c;看下图 我们先声明出指针p和指针q&#xff0c;还有指针head&#xff08;主要用于return上而已&#xff09;&#xff0c;然后进行一系列操作&#xff0c…

从源码学习单例模式

单例模式 单例模式是一种设计模式&#xff0c;常用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这意味着无论在程序的哪个地方&#xff0c;只能创建一个该类的实例&#xff0c;而不会出现多个相同实例的情况。 在单例模式中&#xff0c;常用的实现方式包括懒汉…

【论文精读】DALL·E2

摘要 CLIP被证明其可以学习到鲁棒的图像特征&#xff0c;可以有效的捕获图像的语义和风格&#xff0c;且具有很强的zero-shot能力。另外&#xff0c;Diffusion是目前最优的生成式框架&#xff0c;其推动了图像、视频生成任务的最先进性能。Classifier-Free Diffusion指导技术以…

汽车大灯尾灯灯罩裂了可以修复吗?汽车大灯尾灯裂缝修复用什么胶?拆开的灯罩用什么胶合壳密封?

随着科学技术的不断发展&#xff0c;汽车大灯尾灯破损是可以修的。 TADHE车灯无痕修复专用UV胶是一种经过处理的UV树脂胶&#xff0c;主要成份是改性丙烯酸UV树脂。应用在车灯的专业无痕修复领域。 其具备环氧树脂胶优点的同时&#xff0c;还有如下特点&#xff1a; 固化时间…

Vue模板引用之ref特殊属性

1. 使用实例 <template><input ref"input" name"我是input的name" /><br /><ul><li v-for"arr in array" :key"arr" id"111" ref"itemRefs">{{arr}}</li></ul> </…

【蓝桥杯省赛真题28】python输出字符串 中小学青少年组蓝桥杯比赛python编程省赛真题解析

目录 python输出字符串 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python输出字符串 第十二届蓝桥杯青少年组python比赛选拔赛真题 一、题…

IDA使用-2023CICSN华中赛区pwn题逆向为例

文章目录 相关字节标识导入函数和导出函数找程序入口函数选项设置重命名CISCN2023华中赛区分区赛AWDIDA源码main 构造结构体sub_141B() 打开局部变量类型的视图增加变量类型重新定义变量类型再次设置变量类型并重新定义再次设置变量类型并重新定义再次设置变量类型并重新定义 设…

JavaSE-04笔记【面向对象01】

文章目录 1. final 关键字1.1 采用final修饰的类不能被继承1.2 采用 final 修饰的方法不能被覆盖1.3 采用 final 修饰的变量(基本类型)不能被修改1.4 采用final 修饰的变量必须显示初始化1.5 如果修饰的引用&#xff0c;那么这个引用只能指向一个对象&#xff0c;也就是说这个引…

云原生之容器编排实践-kubectl get pod -A没有coredns

背景 前面搭建的3节点 Kubernetes 集群&#xff0c;其实少了一个组件&#xff1a; CoreDNS &#xff0c;这也是我后面拿 ruoyi-cloud 项目练手时&#xff0c;部署了 MySQL 和 Nacos 服务后才意识到的&#xff1a;发现Nacos无法通过服务名连接MySQL&#xff0c;这里 Nacos 选择…

MySQL-主从复制

目录 1. 主从复制概述 1.1 如何提升数据库并发能力 1.2 主从复制的作用 2. 主从复制的原理 2.1 原理剖析 三个线程 复制三步骤 复制的问题 2.2 复制的基本原则 3. 一主一从架构搭建 3.1 准备工作 3.2 主机配置文件 3.3 从机配置文件 3.4 主机&#xff1a;建立账户…

Vue packages version mismatch 报错解决

问题 npm run dev 运行项目的过程中&#xff0c;报错 Vue packages version mismatch 解决方法 根据报错不难看出是 vue 与 vue-template-compiler 版本产生了冲突&#xff0c;vue 与 vue-template-compiler 的版本是需要匹配的。所以解决的办法就是先修改其中一个的版本将 v…

Programming Abstractions in C阅读笔记:p293-p302

《Programming Abstractions in C》学习第73天&#xff0c;p293-p302总结&#xff0c;总计10页。 一、技术总结 1.时间复杂度 (1)quadratic time(二次时间) p293, Algorithms like selection sort that exhibit O(N^2) performance are said to run in quadratic time。 2…

如何利用EXCEL批量插入图片

目录 1.excel打开目标表格&#xff1b; 2.点开视图-宏-录制宏&#xff0c;可以改宏的名字或者选择默认&#xff1b; 3.然后点开视图-宏-查看宏 4.点编辑进去 5.修改代码&#xff1a; &#xff08;1&#xff09;打开之后会显示有一堆代码 &#xff08;2&#xff09;将这个…

Django入门指南:从环境搭建到模型管理系统的完整教程

环境安装&#xff1a; ​ 由于我的C的Anaconda 是安装在C盘的&#xff0c;但是没内存了&#xff0c;所有我将环境转在e盘&#xff0c;下面的命令是创建环境到指定目录中. conda create --prefixE:\envs\dj42 python3.9进入环境中&#xff1a; conda activate E:\envs\dj42…

一周学会Django5 Python Web开发-Http请求HttpRequest请求类

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

lxml库和Xpath提取网页数据的基础与实战:完整指南与实战【第92篇—提取网页】

使用lxml库和Xpath提取网页数据的基础与实战 在网络爬虫和数据抓取中&#xff0c;从网页中提取所需信息是一项常见的任务。lxml库和Xpath是Python中用于解析和提取HTML/XML数据的强大工具。本文将介绍lxml库的基础知识&#xff0c;以及如何使用Xpath表达式来准确地提取网页数据…

[HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 网页标题:手机批发业务-商品备选区<

Swift Combine 使用 handleEvents 操作符调试管道 从入门到精通二十五

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…