leetcode面试经典150阶段总结

数组

88.对数组排序(升序):Arrays.sort(nums)

27、26、80.双指针:一个用来存值,一个用来遍历

169.HashMap可以快速查找和访问元素

统计数组中每个元素个数(以键值对形式存在Map中):

private Map<Integer,Integer> countNums(int[] nums)
{
    Map<Integer,Integer> counts=new HashMap<Integer,Integer>();
    for(int nums:nums)
    {
        if(!counts.containsKey(num))
        {
            counts.put(num,1);
        }
        else{
            counts.put(num,counts.get(num)+1);
        }
    }
    return counts;

}

containsKey方法检查counts映射是否已经包含当前数字num作为键

map.put(key,value)在map中添加键值对

Map.entry在遍历Map时非常有用。我们知道,Map中存储的是键值对,而通过Map.entrySet()方法,我们可以获取到包含所有键值对的Set集合。然后,通过遍历这个Set集合,我们可以逐个获取每个Map.entry,进而操作其中的键值对数据。map.entrySet()表示map中的所有键值对

Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("Java", 1);
map.put("Python", 2);
map.put("C++", 3);

// 遍历Map
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

map.getKey()返回当前键值对的键

map.getValue()返回当前键值对的值

189.新建一个长度为n的数组: int[ ] newArr=new int[n];

复制数组:将数组newArr内容复制到nums中

System.arraycopy(newArr原数组,0原数组起始位置,nums目标数组,0目标数组起始位置,n复制元素个数)

121.int minprice=Integer.MAX_VALUE;常量,表示int类型的最大取值

122.定义nxn的二维数组:int[ ][ ] dp=new int [n][n];

求最大值Math.max(_,_);

55.贪心算法,若存在位置下,使x+nums[x]>=y,则y可到达。

380(重要掌握)题目:实现RandomizedSet 类:

  • RandomizedSet() 初始化 RandomizedSet 对象
  • bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
  • bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
  • int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。

你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。

class RandomizedSet {
    List<Integer> nums;
    Map<Integer, Integer> indices;
    Random random;

    public RandomizedSet() {
        nums = new ArrayList<Integer>();
        indices = new HashMap<Integer, Integer>();
        random = new Random();
    }

    public boolean insert(int val) {
        if (indices.containsKey(val)) {
            return false;
        }
        int index = nums.size();
        nums.add(val);
        indices.put(val, index);
        return true;
    }

    public boolean remove(int val) {
        if (!indices.containsKey(val)) {
            return false;
        }
        int index = indices.get(val);
        int last = nums.get(nums.size() - 1);
        nums.set(index, last);
        indices.put(last, index);
        nums.remove(nums.size() - 1);
        indices.remove(val);
        return true;
    }

    public int getRandom() {
        int randomIndex = random.nextInt(nums.size());
        return nums.get(randomIndex);
    }
}

哈希表可以在O(1)完成插入、删除元素

动态/变长数组可以在O(1)完成获取随机元素

ArrayList相关用法:

创建空的动态数组: ArrayList<Integer> nums=new ArrayList<>();

添加元素到ArrayList:nums.add(5);

获取长度:int size=nums.size();

遍历获取元素:int num=nums.;get(i);

删除指定位置元素:nums.remove(2);

判断是否为空:nums.isEmpty();

更新索引为2的值为10:nums.set(2,10);

HashMap相关用法:

创建空的HashMap:HashMap<String,String> st=new HashMap<>();

添加键值对到HashMap:st.put("Bob",10);

获取大小:int size=st.size();

根据键获取值:int score =st.get("Bob");

检查是否包含指定键: st.containsKey("Bob");

删除指定键的键值对:st.remove("Bob");

清空:st.clear();

判断是否为空: st.isEmpty();

随机生成介于0和n之间的整数:

Random random=new Random();

int randomIndex=random.nextInt(nums.size());

要在类的开头声明成员变量,并在构造函数中初始化,否则无法在类的其他方法中访问

238.将数组nums所有值设为1:Arrays.fill(nums,1);

字符串

13.获取字符串str中指定索引位置的字符:char c=str.charAt(i);

获取字符串的长度:int n=str.length();数组的长度是:int n=arr.length;

12.创建StringBuffer对象:StringBuffer str=new StringBuffer();如果是String无法做修改

将指定字符串追加到当前字符串末尾:str.append("ha");

输出字符串:str.toString();将字符串输出到列表:list.add(str.toString());

58.将字符串以指定分隔符拆分为子字符串数组:String[ ] arr=str.split("分隔符");

14.删去字符串中指定位置的字母:sb.deleteCharAt(sb.length()-1);

检查字符串str是否以指定字符串开头:str.startWith("abb");

151.去除字符串空格拆分为数组:String[ ] arr=str.trim().split("\\s+");

str.trim()去除字符串首尾空格;\\s+正则表达式,表示一个或多个连续空格;

6.将字符串转换为字符数组:s.toCharArray()

遍历字符数组的每个字符:for(char c:s.toCharArray());

在字符串截取索引片段:str.substring(开始索引,结尾索引(不包含))

68.新建列表:List<String> ans=new ArrayList<String>();

比较两个字符串是否相同不能用==,要用A.equals(B);

125.判断给定字符是否是字母或数字:Character.isLetterOrDigit(ch);

移除字符串中非字母数字字符:String str1=str.replaceAll("[^a-z A-Z 0-9]");

将大写字符转换为小写字符String str2=str1.toLowerCase();

将字符串逆序:str2.reverse();

HashSet相关用法

存储一组不重复的元素,无序,不能根据索引访问元素

Set <Character> occ=new HashSet<>();

添加元素:occ.add('a');

删除元素:occ.remove('a');

判断元素是否存在:occ.contains('a');

list允许存储重复的元素,保留了元素的插入顺序,所以可以根据索引访问和查找元素

54.二维数组matrix行:rows=matrix.length; 列:columns=matrix[0].length;

48.矩阵旋转90°:矩阵第i行第j个元素顺时针旋转90°后,出现在倒数第i列的第j个位置

matrix_new[j][n-i-1]=matrix[i][j];

383.获取map中,字符ch出现的次数,若不存在,则返回默认值0: map.getOrDefault(ch,0);

20.有效的括号 ——栈

Stack类从Vector类继承,底层是用数组实现的线程安全的栈。栈的功能(push/pop/peek),更适用的是使用双端队列接口Deque,并用实现类ArrayDeque/LinkedList来进行初始化。

Deque<Integer> stack = new ArrayDeque<Integer>();//数组存储
Deque<Character> stack = new LinkedList<Character>();//链表存储

stack.push(1);存入栈顶
stack.peek() 的作用是返回栈顶元素,但不是将栈顶元素弹出。
stack.pop() 的作用是返回栈顶元素,并且同时将栈顶元素出栈。

 stack.isEmpty();判断stack是否为空

pollLast(): 从双端队列的尾部(末尾)检索并删除元素。如果队列为空,返回null。

Deque<String> deque = new LinkedList<>();
deque.add("A");
deque.add("B");
String element = deque.pollLast(); // 从尾部删除元素,返回 "B"


poll(): 从双端队列的头部(开头)检索并删除元素。如果队列为空,返回null。

Deque<String> deque = new LinkedList<>();
deque.add("A");
deque.add("B");
String element = deque.poll(); // 从头部删除元素,返回 "A"

Deque接口中的offerLast()Stack类中的push()都用于将元素添加到数据结构的末尾。 

offerLast():返回truefalse,表示元素是否成功添加到队尾;如果容量有限且队列已满,返回false,而不抛出异常。

push()没有返回值,且不会在元素推入失败时返回false,而是会抛出StackOverflowError异常。

java中的双向队列(Deque)
支持在两端插入和移除元素

初始化方法:
Deque<Integer> stack = new LinkedList<Integer>();

接口分析
双向队列操作

插入元素

addFirst(): 向队头插入元素,如果元素为空,则发生NPE
addLast(): 向队尾插入元素,如果为空,则发生NPE
offerFirst(): 向队头插入元素,如果插入成功返回true,否则返回false
offerLast(): 向队尾插入元素,如果插入成功返回true,否则返回false


移除元素

removeFirst(): 返回并移除队头元素,如果该元素是null,则发生NoSuchElementException
removeLast(): 返回并移除队尾元素,如果该元素是null,则发生NoSuchElementException
pollFirst(): 返回并移除队头元素,如果队列无元素,则返回null
pollLast(): 返回并移除队尾元素,如果队列无元素,则返回null


获取元素

getFirst(): 获取队头元素但不移除,如果队列无元素,则发生NoSuchElementException
getLast(): 获取队尾元素但不移除,如果队列无元素,则发生NoSuchElementException
peekFirst(): 获取队头元素但不移除,如果队列无元素,则返回null
peekLast(): 获取队尾元素但不移除,如果队列无元素,则返回null


栈操作

pop(): 弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则发生NoSuchElementException
push(): 向栈中压入元素,也就是向队头增加元素,等价于addFirst(),如果元素为null,则发生NPE,如果栈空间受到限制,则发生IllegalStateException
                      
原文链接:https://blog.csdn.net/jiayoudangdang/article/details/121770492

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值