队列
单向队列
1. 定义一个队列
Queue<Integer> q = new LinkedList<>();
Queue<Character> q = new LinkedList<>();
2. 入队列
q.offer(1);
q.offer(2); // 从队尾入队列
q.add();
3. 出队列
q.poll() // 从队头出队列,并将删除的元素返回
4. 获取队列长度
q.size() // 获取长度
5. 获取头元素
q.peek() // 获取头元素
6. 判断队列是否为空
q.isEmpty() // 判断队列是否为空
7. 将字符串转换为队列
// 将字符串转为队列
for(int i = 0; i < str.length(); i++){
queue.offer(str.charAt(i));
}
双向队列
1. 定义
Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> deque = new LinkedList<>();//双端队列的链式实现
2. 从队尾添加或删除
deque.addLast()
deque.pollLast();
循环队列
- 通过添加 size 属性记录,如果size等于数组长度则满,否则不满
- 保留一个位置
- 使用标记,判断尾的下一个是不是头
相关方法
Front(); // 从队首获取元素
Rear(); // 获取队尾元素
enQueue(value); // 向循环队列插入一个元素
deQueue(); // 从循环队列中删除一个元素
isFull; // 检查循环队列是否已满
其他算法知识点总结
方法
1. 将int类型转换为string类型
Integer.toString(m):仅限整数
String.valueOf(m):可以处理多种数据类型的转换
2. 将string转为int
Integer.parseInt()|Integer.valueOf()
num1.charAt(i)-‘0’
3. 字符移位
String str = "abc";
int count = 3; // 后移位数
for(int i = 0; i < str.length();i++){
char charIndex = str.charAt(i);
charIndex = (char)((charIndex - 'a' + count) % 26 + 'a');
}
4. 统计一个字符串在另一个字符串中出现的次数
String str = "1231132323"; // 完整字符串
String s = "123"; // 判断字符串
char[] charArray = str.toCharArray();
char[] charArray2 = s.toCharArray();
int length = charArray2.length; // 需要判断的字符串长度
int count = 0 ; // 计数
int cur = 0 ; // 数组下标
for(int x = 0 ; x < charArray.length ; x++) {
char c1 = charArray[x];
char c2 = charArray2[cur];
if(c1 == c2) {
if(cur == (length-1)) {
count ++ ; // 找到一个字符串,计数+1
cur = 0 ;
}else {
cur++; // 找到部分,下标+1
}
}else {
cur = 0 ; // 没找到,下标置为0
}
}
System.out.println("统计到字符串的个数:count333="+count);
5. 比较两个对象大小关系
compareTo
(o2 + o1).compareTo(o1 + o2) 来比较两个字符串拼接后的大小关系
常规知识
1. 10的9次方
long m = 1e9
2. 完全平方
一个数的因子个数为奇数当且仅当它是一个完全平方数
计算范围[A,B]内的完全平方数:ceil(sqrt(B))-floor(sqrt(A))+1