大家好,我是
方圆
无它,唯手熟尔
题号
剑指 Offer 57 - II. 和为s的连续正数序列
- 思路:对于这种有序数组,优先想到双指针和滑动窗口
class Solution {
public int[][] findContinuousSequence(int target) {
int i = 1;
int j = 1;
int sum = 0;
List<int[]> res = new ArrayList<>();
while(i <= target / 2){
if(sum < target){
sum += j;
j++;
}else if(sum > target){
sum -= i;
i++;
}else{
int[] arr = new int[j - i];
for(int k = i;k < j;k++){
arr[k - i] = k;
}
res.add(arr);
sum -= i;
i++;
}
}
return res.toArray(new int[res.size()][]);
}
}
剑指 Offer 58 - I. 翻转单词顺序
class Solution {
public String reverseWords(String s) {
s = s.trim();
int i = s.length() - 1,j = i;
StringBuilder res = new StringBuilder();
while(i >= 0){
while(i >= 0 && s.charAt(i) != ' ')
i--;//将i指向单词前的空格
res.append(s.substring(i + 1,j + 1) + " ");
while(i >= 0 && s.charAt(i) == ' ')
i--;//去掉两单词间多余的空格
j = i;
}
//去掉尾部多余的一个空格
return res.toString().trim();
}
}
剑指 Offer 58 - II. 左旋转字符串
- 思路:切成两段
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n,s.length()) + s.substring(0,n);
}
}
剑指 Offer 59 - I. 滑动窗口的最大值
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || k == 0) return new int[0];
int[] res = new int[nums.length - k + 1];
int i = 0,j = k - 1;
int n = 0;
while(j < nums.length){
int flag = Integer.MIN_VALUE;
for(int a = 0;a < k;a++)
flag = Math.max(flag,nums[i + a]);
i++;
j++;
res[n++] = flag;
}
return res;
}
}
剑指 Offer 59 - II. 队列的最大值
class MaxQueue {
private Queue<Integer> queue;
private LinkedList<Integer> max;
public MaxQueue() {
queue = new LinkedList<>();
max = new LinkedList<>();
}
public int max_value() {
return max.size() != 0 ? max.getFirst() : -1;
}
public void push_back(int value) {
queue.add(value);
//这里是while循环条件!!!
while(max.size() != 0 && max.getLast() < value)
max.removeLast();
max.add(value);
}
public int pop_front() {
if(max.size() != 0 && max.getFirst().equals(queue.peek()))
max.removeFirst();
return queue.size() != 0 ? queue.poll() : -1;
}
}
加油儿!