字节跳动笔试题:80%,100%,100%,0%
第一题:前阵子刷过的原题,直接写的,不知为何,只能80%
public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int N=sc.nextInt(); int[] clock=new int[N]; for(int i=0;i<N;i++){ int a=sc.nextInt(); int b=sc.nextInt(); clock[i]=a*60+b; } Arrays.sort(clock); int move=sc.nextInt(); int c=sc.nextInt(); int d=sc.nextInt(); int deadline=c*60+d; for(int i=N-1;i>=0;i--){ if(clock[i]+move<=deadline){ System.out.println((clock[i]/60)+" "+(clock[i]%60)); return; } } } }第二题:应该离最优解不远了。补充一下解释:
A[i]^A[j]表示几个数字异或,S[i]表示加密之后的结果。
以k为4的那个例子来说:(A[i]^A[j]我简写成了A[i][j])
A[0] -> S[0]
A[0][1] -> S[1]
A[0][1][2] -> S[2]
A[0][1][2][3] -> S[3]
A[1][2][3][4] -> S[4]
A[2][3][4][5] -> S[5]
.....
几个重要的异或公式:
A^B=C ,则A^C=B
A^A=0
A^0=A
一个一个求,A[0]=S[0],没问题。
S[0]^S[1]=A[0]^A[0]^A[1]=A[1]
S[2]^S[1]=A[2];
S[3]^S[2]=A[3]
S[4]^S[3]=A[4]^A[0] 处理在这里发生了变化,要再异或上A[0],才能得到A[4],之后的都是如此
。。。。。。。。
public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int N=sc.nextInt(); int K=sc.nextInt(); String S=sc.next(); int[] res=new int[N]; int sum=S.charAt(0)=='1'?1:0; res[0]=sum; for(int i=1;i<N;i++){ int pre=S.charAt(i-1)=='1'?1:0; int now=S.charAt(i)=='1'?1:0; sum=now^pre; if(i>=K){ sum^=res[i-K]; } res[i]=sum; } StringBuffer sb=new StringBuffer(); for(int i=0;i<N;i++){ sb.append(res[i]); } System.out.println(sb.toString()); } }第三题:分糖果,经典题,最优解。
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int[] e=new int[N];
int[] res=new int[N];
//默认初始化为1
Arrays.fill(res,100);
for(int i=0;i<N;i++){
e[i]=sc.nextInt();
}
for(int i=1;i<N;i++){
if(e[i]>e[i-1]){
res[i]=res[i-1]+100;
}
}
for(int i=N-1;i>0;i--){
if(e[i]<e[i-1]&&res[i]>=res[i-1]){
res[i-1]=res[i]+100;
}
}
int sum=0;
for(int i=0;i<N;i++){
sum+=res[i];
}
System.out.println(sum);
}
}