数组
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()
:返回true
或false
,表示元素是否成功添加到队尾;如果容量有限且队列已满,返回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