1 滑动窗口最大值
这个输入输入就当锻炼输入能力了,本题为leetcode 239改编,需要对双端队列Deque熟悉。
写本题时遇到的问题:
1、Deque maxQue = new LinkedList<>(); 这里开头用Deque而不是LinkedList符合面向抽象编程:尽量持有接口,而不是抽象的实现类
2、.split(","),后面括号里面应该是双引号,而非单引号,返回结果为字符串数组String[]
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
// 准备nums
int leftSquare = str.indexOf('[');
int rightSquare = str.indexOf(']');
String[] numsStr = str.substring(leftSquare + 1, rightSquare).split(",");
int[] nums = new int[numsStr.length];
for(int i = 0; i < nums.length; i ++) {
nums[i] = Integer.parseInt(numsStr[i]);
}
// 准备k
int k = Integer.parseInt(str.substring(str.lastIndexOf("=") + 2));
int res = 0;
Deque<Integer> maxQue = new LinkedList<>();
Deque<Integer> minQue = new LinkedList<>();
for (int i = 0; i < k; i ++) {
while (!maxQue.isEmpty() && maxQue.getLast() < nums[i]) {
maxQue.removeLast();
}
maxQue.addLast(nums[i]);
while (!minQue.isEmpty() && minQue.getLast() > nums[i]) {
minQue.removeLast();
}
minQue.addLast(nums[i]);
}
res = maxQue.getFirst() - minQue.getLast();
for (int i = k; i < nums.length; i ++) {
// i - k 是要离开的,i 是新进来的
// 最大
// 判断离开的是不是最大
if (nums[i - k] == maxQue.getFirst()) {
maxQue.removeFirst();
}
while (!maxQue.isEmpty() && maxQue.getLast() < nums[i]) {
maxQue.removeLast();
}
maxQue.addLast(nums[i]);
// 最小
// 判断离开的是不是最小
if (nums[i - k] == minQue.getFirst()) {
minQue.removeFirst();
}
while (!minQue.isEmpty() && minQue.getLast() > nums[i]) {
minQue.removeLast();
}
minQue.addLast(nums[i]);
int tempRes = maxQue.getFirst() - minQue.getFirst();
// System.out.println(tempRes);
// System.out.println("maxQue.getFirst(): " + maxQue.getFirst());
// System.out.println("minQue.getFirst(): " + minQue.getFirst());
if (tempRes > res) {
res = tempRes;
}
}
System.out.println(res);
}
}
2 大数减法
import java.util.*;
class Main {
public static int compare(String a, String b) {
// 先比较长度
if (a.length() > b.length()) { // a > b: 3
return 3;
} else if (a.length() < b.length()) { // a < b: 2
return 2;
}
// 长度相等,从高位开始逐位比较
for (int i = 0; i < a.length(); i ++) {
if (a.charAt(i) - b.charAt(i) > 0) {
return 1;
} else if (a.charAt(i) - b.charAt(i) < 0) {
return 0;
} else {
continue;
}
}
// 两数相等
return -1;
}
public static String minus(String a, String b) {
int whoIsBigger = compare(a, b);
String zeors = "";
if (whoIsBigger == 3) {
// a长,b前补0
for (int i = 0; i < a.length() - b.length(); i ++) {
zeors = zeors + "0";
}
b = zeors + b;
}
if (whoIsBigger == 2) {
// b长,a前补0
for (int i = 0; i < b.length() - a.length(); i ++) {
zeors = zeors + "0";
}
a = zeors + a;
}
if (whoIsBigger == -1) {
return "0";
}
// b更大,ab换下顺序,最后加负号
whoIsBigger = compare(a, b);
if (whoIsBigger == 0) {
String temp = a;
a = b;
b = temp;
}
String res = "";
int jiewei = 0;
for (int i = a.length() - 1; i >= 0; i --) {
if (a.charAt(i) - b.charAt(i) - jiewei >= 0) {
res = (a.charAt(i) - b.charAt(i) - jiewei) + res;
jiewei = 0;
} else {
res = (10 + (a.charAt(i) - b.charAt(i)) - jiewei) + res;
jiewei = 1;
}
}
// 把前面的0去掉
int lastZeroIndex = 0;
for (int i = 0; i < res.length(); i ++) {
if (res.charAt(i) != '0') {
lastZeroIndex = i;
break;
}
}
res = res.substring(lastZeroIndex);
if (whoIsBigger == 0) {
res = "-" + res;
}
return res;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] input = scanner.nextLine().split(" ");
System.out.println(minus(input[0], input[1]));
scanner.close();
}
}

Comments NOTHING