1、 左旋转字符串
1.1 题目描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
1.2 题解
1.2.1 切片
public String reverseLeftWords(String s, int n) {
return s.substring(n, s.length()) + s.substring(0, n);
}
1.2.2 列表遍历拼接
public String reverseLeftWords(String s, int n) {
StringBuilder res = new StringBuilder();
for(int i = n; i < s.length(); i++)
res.append(s.charAt(i));
for(int i = 0; i < n; i++)
res.append(s.charAt(i));
return res.toString();
}
2、滑动窗口的最大值
2.1 题目描述:
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
2.2 题解
2.2.1 使用单调队列
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 0 || k == 0) return new int[0];
Deque<Integer> deque =new LinkedList<>();
int[] res =new int[nums.length-k+1];
for(int i=0;i<k;i++){// 未形成窗口
while(!deque.isEmpty() && deque.getLast()<nums[i])
deque.removeLast();
deque.addLast(nums[i]);
}
res[0]=deque.getFirst();
int index=1;
for(int i=k;i<nums.length;i++){//形成窗口
if(!deque.isEmpty() && deque.getFirst()==nums[i-k])
deque.removeFirst();
while(!deque.isEmpty() && deque.getLast()<nums[i])
deque.removeLast();
deque.addLast(nums[i]);
res[index++]=deque.getFirst();
}
return res;
}
3、队列的最大值
3.1 题目描述:
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
3.2 题解
3.2.1
Deque<Integer> deque;
Queue<Integer> queue;
public MaxQueue() {
deque=new LinkedList<>();
queue=new LinkedList<>();
}
public int max_value() {
if(queue.isEmpty()){
return -1;
}
return deque.getFirst();
}
public void push_back(int value) {
queue.add(value);
while(!deque.isEmpty()&& deque.getLast()<value)
deque.removeLast();
deque.add(value);
}
public int pop_front() {
if(queue.isEmpty()){
return -1;
}
if(queue.peek().equals(deque.getFirst()))
deque.removeFirst();
return queue.poll();
}