字节跳动笔试题: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);
    }
}






#字节跳动##笔试题目#
全部评论
第一题有问题。就是有一个(或对个)测试用例,即使最早的闹钟响起,也会导致迟到(与题意不符,题意保证肯定有解)。然后我在最后加了一个判断,如果所有闹钟都无法满足条件,就输出最早的闹钟时间,然后全通过了。
点赞 回复 分享
发布于 2019-08-11 22:40
第二题写得好
点赞 回复 分享
发布于 2019-08-11 21:43
100%-0%-100%-0%,😭不知道能不能进面试,难受
点赞 回复 分享
发布于 2019-08-11 21:56
第三题没看懂,i从后向前遍历是在做什么
点赞 回复 分享
发布于 2019-08-11 21:41
第一题有没有可能是数据量太大了,既然都排好序了,可以二分吧。菜鸡的一点点拙见。
点赞 回复 分享
发布于 2019-08-11 21:50
第二题 if __name__ == "__main__":     N, K = map(int, input().split())     S = input()     res = S[0]     dp = [int(S[0])]     for i in range(1, K):         res += str(dp[-1] ^ int(S[i]))         dp.pop(0)         dp.append(int(S[i]))     for j in range(K, N):         tmp = int(res[j-K])         tmp ^= dp[-1]         if j > K:             tmp ^= int(res[-1])         dp.append(tmp)         res += str(dp[-1] ^ int(S[j]))         dp.pop(0)     print(res)
点赞 回复 分享
发布于 2019-08-11 21:55
优秀
点赞 回复 分享
发布于 2019-08-11 22:06
https://github.com/NjustJiaweihan/NowCoder_HuaWei/tree/master/2019-08-11-%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8
点赞 回复 分享
发布于 2019-08-11 22:11
第一题没考虑超过24小时之后的
点赞 回复 分享
发布于 2019-08-12 14:13

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
09-25 13:56
门头沟学院 Java
V进厂倒计时:直接外包给你还不要出钱,完美
点赞 评论 收藏
分享
头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
2 34 评论
分享
牛客网
牛客企业服务