2AC+0.8华为笔试4.8

华为今天的题目感觉相比往年偏简单了,三道题前两题直接秒,第三题调试了一小时,交卷后等考试结束发题解🤣感觉这是今年暑期实习最简单的笔试之一

第一题AC

n是底数,L是次数,实际结果就是n的1次+n2+...n的L次
即:L为1那么结果是n,L为2结果是n + n * n...以此类推
难点在于:如果直接计算n的L次,那么不仅int会超出,long尝试后也超出,所以用到快速幂。
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while (true){
        int n = sc.nextInt();
        int l = sc.nextInt();
        if(n == 0 && l == 0) break;
        long res = 0;
        for (int i = 1; i <= l; i++) {
            res += quickMi(n, i);
        }
        System.out.println(res % 1000000007);
    }
    sc.close();
}

private static long quickMi(long aa, long bb){
    long res = 1;
    long a = aa, b = bb;
    a %= 1000000007;
    for (; b != 0; b /=2) {
        if(b % 2 == 1){
            res = (res * a) % 1000000007;
        }
        a = (a * a) % 1000000007;
    }
    return res;
}

第二题AC

00可以替换为10,10可以替换为01
考虑情况:
  1. 如果是00,直接替换为10;
  2. 如果是11,不做修改;
  3. 如果是10,当前一个数也为0,即010的情况,可以替换为101,否则不做修改;
  4. 如果是01,同第3条。
  5. 这里漏考虑了一些情况,详情请见@KaitoHH的回复
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int t = Integer.valueOf(sc.nextLine());
    for (int x = 0; x < t; x++) {
        int n = Integer.valueOf(sc.nextLine());
        String num = sc.nextLine();
        char[] nums = num.toCharArray();
        for (int i = 0; i <= n - 2; i++) {
            if(nums[i] == '0' && nums[i + 1] == '0'){
                nums[i] = '1';
            }else if(nums[i] == '0' && nums[i + 1] == '1' && i < n - 2 && nums[i + 2] == '0'){
                nums[i] = '1';
                nums[i + 1] = '0';
                nums[i + 2] = '0';
            }
        }
        String res = new String(nums);
        System.out.println(res);
    }
    sc.close();
}

第三题0.8

数独游戏,题目应该指的是肯定有解,那么最简单的就是递归法,这个方法应该是超时,但错误提示是未通过所有用例,改不动了就直接交卷了
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    for (int i = 0; i < 9; i++) {
        String matr = sc.nextLine();
        for (int j = 0; j < 9; j++) {
            nums[i][j] = matr.charAt(2 * j + 1) - '0';    //这里注意要用减0,测试用加0会出问题
        }
    }
    sc.close();
    sudu(0, 0);
}

private static int[][] nums = new int[9][9];

private static void sudu(int i, int j) {
    if(i == 8 && j == 9){
        for (int x = 0; x < 9; x++) {
            System.out.print("{");
            for (int y = 0; y < 8; y++) {
                System.out.print(nums[x][y] + ",");
            }
            if(x < 8) System.out.println(nums[x][8] + "}");
            else System.out.print(nums[x][8] + "}");   //注意最后一行不输出换行
        }
        return;
    }
    if(j == 9){
        i++;
        j = 0;
    }
    if(nums[i][j] == 0){
        for (int k = 0; k <= 9; k++) {
            if(isNine(i, j, k)){
                nums[i][j] = k;                    //依次填数字,然后验证
                sudu(i, j + 1);
                nums[i][j] = 0;                    //如果验证失败,数字重新写回0
            }
        }
    }else sudu(i, j + 1);                          //不是0,即已经填了数字,直接递归
}

private static boolean isNine(int x, int y, int curr) {
    int tempX = x / 3;
    int tempY = y / 3;
    for (int i = 0; i < 3; i++) {                       //检查粗线格子
        for (int j = 0; j < 3; j++) {
            if(nums[tempX * 3 + i][tempY * 3 + j] == curr) return false;
        }
    }
    for (int i = 0; i < 9; i++) {                       //检查行列
        if(nums[x][i] == curr || nums[i][y] == curr) return false;
    }
    return true;
}    
#华为笔试##华为##笔试题目#
全部评论
LZ第二题做的不太对哦。 比如对于 01110 , LZ的输出是01110 但是实际上 01110 -> 01101 -> 01011 -> 00111 -> 10111 因此10111才是最大的。标答估计和LZ犯了同样的错误。
9 回复 分享
发布于 2020-04-08 21:06
第三题就是LeetCode第37题解数独,https://leetcode-cn.com/problems/sudoku-solver/
3 回复 分享
发布于 2020-04-08 21:03
有没有人第三题用DLX写的,我用了一万年的板子,从来没错过,第三题只能90分,严重怀疑他数据有多解或是其他情况;btw,第二题他数据必错(害我找了一个半小时的bug没空改第三题
3 回复 分享
发布于 2020-04-08 21:33
菜鸡不懂为啥要 % 1000000007,求各位大佬解答
1 回复 分享
发布于 2020-04-12 20:11
膜拜大佬,第一题超出范围我实在是没排除bug,自惭形秽啊
点赞 回复 分享
发布于 2020-04-08 21:04
哎第一题快速幂脑子抽了没想到,一直调字符串幂乘+字符串加法,不过后面两题很快AC,提前一小时交卷
点赞 回复 分享
发布于 2020-04-08 21:08
第三题我也是80%,为什么会这样
点赞 回复 分享
发布于 2020-04-08 21:13
诶这第一题我用python不用快速幂100 15的就能过,但是测试用例就有通不过的,再加上第二题怎么也没法AC,感觉数据也有问题。。。哭聊
点赞 回复 分享
发布于 2020-04-08 21:16
2个ac 一个0.9  最后一个提示时间超了,不知道是不是python慢的原因,python是不是不该用递归,该用迭代
点赞 回复 分享
发布于 2020-04-08 21:24
我第一题用python用自带的乘方然后取余,就只通过了20%两个N=1的测试。我佛了,理论上python3的int可以无限长啊,然后取一次余。一直在第一题纠结。
点赞 回复 分享
发布于 2020-04-08 21:29
第一题我用笨方法做的,楼主这快速幂巧妙
点赞 回复 分享
发布于 2020-04-09 09:12
迷惑 楼主大概啥时候投的呀
点赞 回复 分享
发布于 2020-04-09 10:24
楼主有消息了吗
点赞 回复 分享
发布于 2020-04-11 09:13

相关推荐

hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
评论
13
69
分享
牛客网
牛客企业服务