2.8143AC字节笔试4.12坑点解析
第一题AC
思路过于简单直接给代码,坑点是,不能把b数组也记录下来(不记录时间复杂度为2n,记录则时间复杂度为3n。。。别问我为什么这么优化,因为没其他地方优化。。。)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
int[] nums = new int[t];
for (int i = 0; i < t; i++) {
int n = sc.nextInt();
int[] a = new int[n];
for (int j = 0; j < n; j++) {
a[j] = sc.nextInt();
}
boolean res = true;
boolean chan = false;
int k = 0;
int right = 0;
for (int j = 0; j < n; j++) {
int b = sc.nextInt();
if(b == a[j]) continue;
if(a[j] > b){
res = false;
right = n - j - 1;
break;
}
if(a[j] != b){
k = b - a[j];
if(chan){
res = false;
right = n - j - 1;
break;
}else {
while (j < n){
if(a[j] == b){
break;
}
if(a[j] + k != b){
res = false;
break;
}
b = sc.nextInt();
j++;
}
chan = true;
}
}
}
if(res) nums[i] = 1;
else nums[i] = 2;
for (int j = 0; j < right; j++) {
sc.nextInt();
}
}
sc.close();
for (int i = 0; i < t; i++) {
if(nums[i] == 1) System.out.println("YES");
else if(nums[i] == 2)System.out.println("NO");
}
} 第二题0.2
也是很暴力的思路,但是还有一些条件没考虑到,不知道大佬有没有优秀的解法
private static int res = 0;
private static ArrayList<Integer> nums = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
nums.add(sc.nextInt());
}
sc.close();
if(n == 1) System.out.println(0);
else {
cut(0);
System.out.println(res);
}
}
private static void cut(int i) {
if(i == nums.size()) return;
if(i == nums.size() - 1){
if(nums.get(i) >= nums.get(i - 1)) return;
cut(i - 1);
}
if(nums.get(i) <= nums.get(i + 1)) cut(i + 1);
else if(i == 0){
int sum = nums.get(i);
int right = nums.get(i + 1);
int curr = sum;
while (curr > right) curr /= 2;
nums.remove(0);
int index = 0;
while (sum > right){
sum -= curr;
nums.add(0, curr);
res++;
index++;
}
nums.add(0, sum);
cut(index);
}else {
int sum = nums.get(i);
int right = nums.get(i + 1);
int left = nums.get(i - 1);
if (sum < left) cut(i - 1);
nums.remove(i);
int index = i;
while (sum > right * 2) {
nums.add(i, right);
res++;
index++;
sum -= right;
}
if (sum > right + left) {
nums.add(i, right);
nums.add(i, sum - right);
res++;
}else {
nums.add(i, left);
nums.add(i, sum - left);
res++;
}
cut(index + 1);
}
} 第三题0.9
也是很暴力的思路。。坑点:1.找优惠券的时候用一下二分查找;2.可能存在没有优惠券可用的情况(所有优惠券面额都大于该价格),对了,不要用数组记录第二个数组,那样会多了m的复杂度
private static int[] cuts;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
cuts = new int[n];
for (int i = 0; i < n; i++) {
cuts[i] = sc.nextInt();
}
Arrays.sort(cuts);
int money = 0;
long res = 0;
for (int i = 0; i < m; i++) {
money = sc.nextInt();
int left = find(money);
while (left >= 0 && cuts[left] > money){
left--;
}
if(left >= 0) res = res + (long) money - (long) cuts[left];
else res = res + (long) money;
}
sc.close();
System.out.println(res);
}
public static int find(int mon){
int left = 0, right = cuts.length - 1;
int mid = (left + right) / 2;
while (left < right){
if(cuts[mid] < mon) left = mid + 1;
else if(cuts[mid] > mon) right = mid - 1;
else return mid;
mid = (left + right) / 2;
}
return left;
} 第四题0.7143
也是暴力。。。。坑点:如果在循环直接输出,ac0.5714,如果记录下结果最后输出0.7143.。。字节今天的题都很简单很暴力,但很烦,而且有很多奇奇怪怪的细节
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
ArrayList<String> ans = new ArrayList<>();
for (int i = 0; i < t; i++) {
int n = sc.nextInt();
int[] nums = new int[n];
for (int j = 0; j < n; j++) {
nums[j] = sc.nextInt();
}
StringBuffer curr = new StringBuffer();
for (int j = 0; j < n; j++) {
int val = nums[j];
int left = j - 1;
int res = 0;
while (left >= 0 && nums[left] <= val){
left--;
res++;
}
int right = j + 1;
while (right < n && nums[right] <= val){
right++;
res++;
}
if(j < n - 1) curr.append(res + " ");
else curr.append(res);
}
ans.add(curr.toString());
}
sc.close();
for (int i = 0; i < ans.size(); i++) {
System.out.println(ans.get(i));
}
}