Bilibili後端筆試試卷
第一題:原地翻轉字符串,要求空間複雜度O(1),時間複雜度 O(n)
AC 100% 代碼:
import java.util.Scanner;
/**
* @author HGS
* @date 2019/08/20
*/
public class BiliBili01 {
public static void swap(char[] chars, int a, int b) {
char temp = chars[a];
chars[a] = chars[b];
chars[b] = temp;
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
char[] temp = s.toCharArray();
int len = temp.length;
int l = 0;
int r = len - 1;
// 第一步,首先把整個字符數組逆序過來
while (l < r) {
swap(temp, l++, r--);
}
l = 0;
// 第二步,把以空格還原逆序的單詞
boolean isHaveBlank = false;
for (int i = 0; i < len; i++) {
if (temp[i] == ' ') {
r = i - 1;
while (l < r) {
swap(temp, l++, r--);
}
l = i + 1;
isHaveBlank = true; // 標記爲真
}
}
r = len - 1;
while(l < r){ //最後剩下的一個單詞也要逆序
swap(temp,l++,r--);
}
if (!isHaveBlank) { // 如果不含空格再倒敘回來
l = 0;
r = len - 1;
while (l < r) {
swap(temp, l++, r--);
}
}
for (int i = 0; i < len; i++) {
System.out.print(temp[i]);
}
}
}
第二題:將一個數組,連接起來排成一個數,輸出能排出的所有數字最小的一個
AC 100% 代碼:
import java.util.Arrays;
import java.util.Scanner;
/**
* @author HGS
* @date 2019/08/20
*/
public class BiliBili02 {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
String[] split = s.split(",");
Arrays.sort(split, (s1, s2) -> (s1 + s2).compareTo(s2 + s1));
for (int i = 0; i < split.length; i++) {
System.out.print(split[i]);
}
System.out.println();
}
}
第三題:01揹包問題
AC 100% 代碼:時間複雜度O(n*logn)
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
/**
* @author HGS
* @date 2019/08/20
*/
public class BiliBili03 {
public static class Node {
int w;
int v;
double wv; // 單位w的價值
Node(int w) {
this.w = w;
}
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
Node[] nodes = new Node[n];
for (int i = 0; i < n; i++) {
int w = sc.nextInt();
nodes[i] = new Node(w);
}
for (int i = 0; i < n; i++) {
int v = sc.nextInt();
nodes[i].v = v;
}
// 貪心思路,設置一個價值數組 單位w的價值v,價值大的優先
for (int i = 0; i < n; i++) {
if (nodes[i].w == 0) {
nodes[i].wv = Integer.MAX_VALUE;
} else {
nodes[i].wv = nodes[i].v * 1.0 / nodes[i].w;
}
}
Arrays.sort(nodes, new Comparator<Node>() { // 根據價值從大到小排序
@Override
public int compare(Node o1, Node o2) {
String s1 = String.valueOf(o1.wv);
String s2 = String.valueOf(o2.wv);
return s2.compareTo(s1);
}
});
int res = 0;
for (int i = 0; i < n; i++) {
if (nodes[i].w <= m) {
res += nodes[i].v;
m -= nodes[i].w;
}
if (m <= 0) {
break;
}
}
System.out.println(res);
}
}