2024年最新力扣刷题——哈希表总结——两数之和(哈希表解法,2024年最新腾讯前端面经

ajax

1)ajax请求的原理/ 手写一个ajax请求?
2)readyState?
3)ajax异步与同步的区别?
4)ajax传递中文用什么方法?

ajax.PNG

前12.PNG

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

0.2.2、Arrays类相关方法:(以Arrays类名调用):

1:asList

2:binarySearch

3:copyOf

4:sort

0.3、String类

0.3.0、String类 :Class String

0.3.1、String类相关方法(以实例化后的引用对象名调用):

0.3.2、String类的方法

1:处理字符串问题的类方法(静态方法public static )valueOf(),

2:处理字符串问题的实例方法toCharArray()

0.4、总结

1.1、

1.2.1、有效的字母异位词    242

题目链接:

力扣

1.2.2、赎金信          383

1.2.3、字母异位词分组        49

1.2.4、找到字符串中所有的字母异位词           438

暴力解法安慰奖

滑动窗口解法

1.3.1、两个数组的交集            349

1.3.2、两个数组的交集(2)             350

1.4.0、快乐数(暂空)(后续补充)

1.5、两数之和(哈希表解法)        1



0.哈希表理论基础及其常用方法总结:

==================

0.1、collection 源码


手撕Set,Map,LinkedList,ArrayList,List,HashSet,HashMap,Array源码的B站教学视频

java集合、数组、List、哈希表、Map、Collections、java泛型、java泛型接口_哔哩哔哩_bilibili


0.2、个人总结,刷题时常用到的一些与字符串和数组相关的方法:


0.2.0、Class Arrays


public class Arrays

extends Object

该类包含用于操作数组的各种方法(如排序和搜索)。 该类还包含一个静态工厂,可以将数组视为列表。

如果指定的数组引用为空,则该类中的方法都抛出一个NullPointerException ,除非另有说明。

0.2.1、Arrays类相关方法:(以数组名调用)

数组名可以调用的:常用的,不外乎如上的,长度,克隆,判断内容相等否,还要哈希码以及返回字符串描述。

  • 其中关于equals(object)方法。在Java中,双等号(==)判断的是他的身份,equals判断的是它的内容,身份相同了,内容自然相同!

  • 这里不多赘述,后期会补equals(obj)和等号的区别。

public class

ArraysTest

{

public static void main(String[] args)

{

int[] nums = new int[]{1,0,2,4};

int[] nums1 = new int[]{1,0,2,4,666};

int[] nums2 = new int[]{1,0,2,4};

int[] nums3 = {1,0,2,4};

int[] nums4 = {1,0,2,4};

int[] nums5 = nums3;

int length = nums.length;

System.out.println(length);

System.out.println(nums.equals(nums1));

System.out.println(nums.equals(nums2));

System.out.println(nums3.equals(nums4));

System.out.println(nums3.equals(nums5));

System.out.println(nums2.equals(nums3));

}

}

结果是

0.2.2、Arrays类相关方法:(以Arrays类名调用):

  • 1:asList

这里需要注意asList方法两点,一个是他的返回值是Obj对象类型的(包装类)

  • 还有一点就是Java版本搞起来之后,列表的声明虽然可以add不同类型的对象进去,但是严进宽出,后续会补充关于集合类的专题。此处重点讨论方法

  • 2:binarySearch

  • 二分法查找 :方法看起来多,但是就两种,

  • 一种参数列表是 要查找的数组 nums 和要查找的值 key

  • 还有一种是在上一种的范围是加上了起始位置和终止位置

  • 但是这里是左闭右开的!!!!一定要注意!!!

  • 其次还有一点,这个方法查找不到时返回的负数是随机的,跟我们二分查找练习自己手敲代码和平时刷题要求的 - 1不同,随即返回,刷题用的时候注意数组下标越界,漏右边的数,以及返回值异常!~

  • 3:copyOf

  • 扩容专用,扩完容后吃嘛嘛香

  • 4:sort

  • 数组排序,在处理字符数组的字母异数词问题中妙用无穷

  • 此外:在处理数组问题是,还要注意到一个比较有用的小tips

  • 题目不要求返回索引而是要求返回数组的元素值的时候,通过sort进行排序之后问题往往迎刃而解,操作起来大有可为

  • (但是注意部分题目如二分查找变种,你这样搞面试官会让你回去等通知~

0.3、String类


0.3.0、String类 :Class String

SerializableCharSequenceComparable < String >


public final class String

extends Object

implements Serializable, Comparable<String>, CharSequence

String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。

字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。

  • 此处就不得不提到字符串的初始化声明方式了:(后续发专帖补充)

0.3.1、String类相关方法(以实例化后的引用对象名调用):

即:通过数组名.方法进行调用。

方法令人眼花缭乱,可以自己测试方法,但是 String的length不同于Arrays的

Arrays的length是 public final int!因为数组在声明的时候长度就要确定,且是固定不变。加上final修饰符就无法修改

但是String获取长度的是方法。有括号

关于能以stringName 即字符串名(对象的引用变量名) 调用这么多方法,我个人的一点浅薄的见解是

String 后面的 不只是 stringName,还是一个引用变量,每个对象(字符串)都是截然不同的!

因此可以根据实例化出来的不同的对象,进行对象名((字符串名)||(引用变量名))进行调用这么多五彩缤纷眼花缭乱的方法。

正如我们每个人,生而不同,有各自的特征,但最终走的无非就是那几条相同的路,殊途同归。

只但愿你我路上不孤单,以梦为马,不负韶华。

0.3.2、String类的方法

1:处理字符串问题的类方法(静态方法public static )valueOf(),

妙用无穷~

public static String format(Locale l,

String format,

Object… args)

  • 静态方法!

  • 使用指定的区域设置,格式字符串和参数返回格式化的字符串。

2:处理字符串问题的实例方法toCharArray()

妙用无穷~

char[] ch = {‘n’,‘i’,‘h’,‘a’,‘o’};

String s = String.valueOf(ch);

System.out.println(s);

String str = “HelloWorld”;

char[] hello = str.toCharArray();

for (char ch1:hello )

{

System.out.print(ch1+" ");

}

nihao

H e l l o W o r l d

结果如上!

valueOf(参数)方法,查源码我们不难发现是静态方法,也就是说,我们可以通过String调用,也可以通过实例化后的 对象名调用 但是官方(包括IDEA)显然希望我们能够通过String类名直接调用。

依我浅薄之见,那些没有static的,不是类方法的,**需要通过实例化对象才能调用的,就是因为不同的对象有不同的特征(属性和行为)**如 stringName.length();方法 ,不同的实例化后的字符串对象有不同的长度 。

那些static修饰的可以以类名直接调用的类方法(静态方法),其实是比较抽象且统一的。

比如阅读 valueOf方法的底层源码,不难发现,这个读取字符数组,最终生成字符串的方法,

他的返回值还是调用了字符串的初始化~~~~

0.4、总结


其实上述关于Arrays和String的类,虽然有三千多字,但是只是Arrays和String类的九牛之一毛,但是刷题中比较常用的这两个类中的方法以及源码分析。越学习发觉自己是一个菜狗。然而不断砥砺前行,坚持下去,你会发现,你变成了一只大菜狗。

开个玩笑,上述总结仅供自己复习参考。由于编制水平有限,文章中难免有断章取义和理解不到位的鄙薄浅陋之见解, 还望读者能不吝赐教,大家一同分享,共同进步。

另外想在此给自己布置个任务,看看源码,那些底层源码的static方法,类方法,是不是具有高度抽象统一的特点,能通过类名.方法调用直接达到预期功能?

然后那些实例化方法,是否必须通过实例化确定具体属性,行为特征的对象才能调用的。是结合特征达到预期功能的?以上仅为本人猜想。

分割线————————————————————————————————————分割线


1.1、


1.2.1、有效的字母异位词    242

题目链接:

力扣

数组其实就是一个简单哈希表,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。定一个数组叫做record,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。

因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下表0,相应的字符z映射为下表25。

再遍历 字符串s的时候,只需要将 s[i] - ‘a’ 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。

那么最后检查一下,record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false。

最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。

时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。

代码随想录

录哥的做法空间消耗小,如果是用下面的处理字母异位词的子串先把字符串转成字符数组 调用toCharArray是一次然后对数组排序Arrays.sort是一次,反而复杂了。

class Solution

{

public boolean isAnagram(String s, String t)

{

int[] hasharr=new int[26];

for(char m : s.toCharArray())

{

hasharr[m-‘a’]+=1;

}

for(char n : t.toCharArray())

{

hasharr[n-‘a’]-=1;

}

for(int i:hasharr)

{

if(i!=0)

return false;

}

return true;

}

}


1.2.2、赎金信          383

力扣

class Solution

{

public boolean canConstruct(String ransomNote, String magazine)

{

//首先,赎金信和杂志,信的每个字符肯定是由 杂志的得到的 如果信的长度长于杂志 白给

//也就是说杂志的长度必定是大于等于赎金信的长度

//信的长度等于杂志 那就要求 信中的每个字符,杂志中都必须有,把杂志存入哈希集合set,这时候

//然后把杂志转成字符串挨个遍历,这种如果是 aab和bba直接破防了

//所以应该都转字符串数组,挨个遍历,开长度为26的数组,挨个记录,每个字母的个数 如果杂志中26个字母,出现在赎金信里的需要用到的都大于等于赎金信中要求的,那么可以完成任务,返回true,如果有一个小于,直接白给

//所以还是最简单的,存入数组,数组又不大,全是英文哪怕大小写都有都在也才五十二个

//常数级开辟数组空间,所需空间为O(1)。

//调用两个 toCharArray方法 遍历两次 ,时间复杂度为 (2n+方法),所以还是O(n)

char[] s1 = ransomNote.toCharArray();

char[] s2 = magazine.toCharArray();

int [] ch1 = new int[27];

int [] ch2 = new int[27];

for(char i : s1)

{

ch1[i-‘a’]++;

}

for(char i : s2)

{

ch2[i-‘a’]++;

}

for(int i=0;i<ch1.length;i++)

{

if(ch1[i] > ch2[i])

{

return false;

}

}

return true;

}

}

//首先,赎金信和杂志,信的每个字符肯定是由 杂志的得到的 如果信的长度长于杂志 白给

数据结构与算法

这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:数组、链表、队列、栈、Set、Map、哈希表等,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。

  • 二叉树层序遍历
  • B 树的特性,B 树和 B+树的区别
  • 尾递归
  • 如何写一个大数阶乘?递归的方法会出现什么问题?
  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

个字符肯定是由 杂志的得到的 如果信的长度长于杂志 白给

数据结构与算法

这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:数组、链表、队列、栈、Set、Map、哈希表等,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。

  • 二叉树层序遍历
  • B 树的特性,B 树和 B+树的区别
  • 尾递归
  • 如何写一个大数阶乘?递归的方法会出现什么问题?
  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

[外链图片转存中…(img-uWKRnpHB-1715748030698)]

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值