字节跳动4.12服务器和客户端笔试(Java实现)
题目描述记不真切就不写了,参加过笔试的应该有印象。
欢迎交流更优解法。
第一题:简单交换
public class ByteDance2020041201 {
public static void main(String[] args) {
//简单交换
Scanner in = new Scanner(System.in);
int t = in.nextInt();
for (int i = 0; i < t; i++) {
int n = in.nextInt();
int[] array1 = new int[n];
int[] array2 = new int[n];
for (int j = 0; j < n; j++) {
array1[j] = in.nextInt();
}
for (int j = 0; j < n; j++) {
array2[j] = in.nextInt() - array1[j];
}
int index = 0;
int gap = 0;
while (index < n) {
if (array2[index] != 0) {
gap = array2[index];
break;
}
index++;
}
while (index < n) {
if (array2[index] != gap) {
gap = array2[index];
break;
}
index++;
}
if (gap != 0) {
if (index == n) {
System.out.println("YES");
break;
}
System.out.println("NO");
break;
}
while (index < n) {
if (array2[index] != gap) {
break;
}
index++;
}
if (index == n) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
} 第二题:折木棒
思路是,倒序遍历找到一个a[i]>a[i+1]。向上取整的除法直接算出需要折断几次,并且用尽可能平均的数替换当前a[i]。(比如数组中存在19,4,需要19/4=5(向上取整)个位置,就需要折断5-1=4次,19/5=3,可以使用3,4,4,4,4替换19,那么直接用3替换19)尽可能平均是为了让a[i-1]的折木棒次数尽量少。
public class Main {
//折木棒
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(in.nextInt());
}
if (n == 1) {
System.out.println(0);
return;
}
int count = 0;
for (int i = n - 2; i >= 0; i--) {
if (list.get(i) > list.get(i + 1)) {
int count1 = (int) Math.ceil((double) list.get(i) / list.get(i + 1));
list.set(i, list.get(i) / count1);
count += count1 - 1;
}
}
System.out.println(count);
}
} 第三题:优惠券对优惠券和商品价格排序,可以直接用指针记录优惠券位置。
据说使用long的res记录结果可以AC。(int过80%)
public class Main {
//优惠券
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] account = new int[n];
int[] price = new int[m];
for (int i = 0; i < n; i++) {
account[i] = in.nextInt();
}
for (int i = 0; i < m; i++) {
price[i] = in.nextInt();
}
Arrays.sort(account);
Arrays.sort(price);
int aIndex = 0;
int pIndex = 0;
long res = 0;
while (pIndex < price.length) {
int currPrice = price[pIndex];
while (aIndex < account.length - 1) {
if (account[aIndex + 1] <= currPrice) {
aIndex++;
} else {
break;
}
}
if (account[aIndex] <= currPrice) {
res += currPrice - account[aIndex];
} else if (aIndex == 0) {
res += currPrice;
} else {
res += currPrice - account[aIndex - 1];
}
pIndex++;
}
System.out.println(res);
}
} 第四题:站得高看得远 单调栈记录数组索引。
#字节跳动##笔试题目#public class Main {
//站得高看得远
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
for (int i = 0; i < t; i++) {
int n = in.nextInt();
int[] height = new int[n];
for (int j = 0; j < n; j++) {
height[j] = in.nextInt();
}
int[] res = new int[n];
Stack<Integer> stack = new Stack<>();
int[] left = new int[n];
int[] right = new int[n];
for (int j = 0; j < n; j++) {
while (!stack.isEmpty() && height[stack.peek()] <= height[j]) {
stack.pop();
}
if (stack.isEmpty()) {
left[j] = 0;
} else {
left[j] = stack.peek() + 1;
}
stack.push(j);
}
stack.clear();
for (int j = n - 1; j >= 0; j--) {
while (!stack.isEmpty() && height[stack.peek()] <= height[j]) {
stack.pop();
}
if (stack.isEmpty()) {
right[j] = n - 1;
} else {
right[j] = stack.peek() - 1;
}
stack.push(j);
}
for (int j = 0; j < n; j++) {
res[j] = right[j] - left[j];
}
for (int j = 0; j < n; j++) {
System.out.print(res[j] + " ");
}
System.out.println();
}
}
} 