10月19日小米第四场笔试第二道编程题

补充一个例子:

1 -> 5 -> 25 -> 125 -> 512

*a *a *a 右移

这个似乎能和上面的形成互补。

小小一步,独立写出的深搜。

结合题例和自己捏的例子大致没什么问题。

可以一看。

总体来说,还没到必须用动态规划之类的我还没掌握的算法才能解决的地步。

debug技巧得到了练习。

(我知道要回溯这件事就是debug出来的!

同时局部变量是不用回溯的我也才明白。)

凌乱的梳理:

尝试使用这样的思路来解题:先考虑大多数情况下的需要的代码,再考虑极端情况下的补丁代码。

A魔法和B魔法是可以交叉使用的——这就意味着可能异常的多,这就是递归出马的时候了。

但除了特殊情况,只能先用A魔法。

右移使用转换字符串实现了,剪切+重拼接。

我觉得关键在于B魔法的使用有两种可能。

一种是位数小于的时候,是绝对不可能得出来的,所以要在B1方法内再调A方法,此时注意全局静态变量的上下文,并且在失败时复原(原来这就是回溯),成功时就不用了。

另一种是位数等于的时候,答案就在此处得出。每循环一次,就在循环内用if检查一次,如果相等了,就及时赋好值退出。

注释的是A、B魔法在最少时的使用次数,如果拓展时也可以问这个。

sc是工具类,直接记忆。

package com.xiaomi;

import java.io.*;

public class Test2 {

    public static int counter = Integer.MAX_VALUE;
    public static int a, b, AC, BC, o;
    public static int printAC, printBC;

    public static class sc {

        static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

        public static int nextInt() throws IOException {
            st.nextToken();
            return (int) st.nval;
        }

        public static <T> void write(T o) {
            pw.print(o);
        }


    }

    public static void A(int o) {
        while (String.valueOf(o).length() <= String.valueOf(b).length()) {
            o *= a;
            AC++;
            if (o == b) {
//                if ((AC + BC) < counter) {
//                    printAC = AC;
//                    printBC = BC;
//                }
                counter = Math.min((AC + BC), counter);
                return;
            }
            if (String.valueOf(o).length() < String.valueOf(b).length()) {
                B1(o);
            } else if (String.valueOf(o).length() == String.valueOf(b).length()) {
                B2(o);
            }
        }
    }

    // 处理位数不等,实质是扩展可能。
    public static void B1(int o) {
        int origin = o;
        int copyBC = 0;
        do {
            if (o < 10 || o % 10 == 0) {
                break;
            }
            String s = String.valueOf(o);
            s = s.substring(s.length() - 1) + s.substring(0, s.length() - 1);
            o = Integer.parseInt(s);
            copyBC++;

            if (o == origin) {
                copyBC = 0;
            }

            BC += copyBC;
            int tmpAC = AC;
            A(o);
            if (o == b) {
                break;
            } else {
                AC = tmpAC;
                BC -= copyBC;
            }

        } while (o != origin);

    }

    public static void B2(int o) {
        int origin = o;
        int copyBC = 0; // 用于单独记录每一次B2中右移操作的次数,因为原先B1的右移计数在B2中会被清零,可这样忽略了此刻的B2就是在之前的B1右移操作上生长出来的。
        do {
            if (o < 10 || o % 10 == 0) {
                break;
            }

            String s = String.valueOf(o);
            s = s.substring(s.length() - 1) + s.substring(0, s.length() - 1);
            o = Integer.parseInt(s);
            copyBC++;

            if (o == b) {
                BC += copyBC;
//                if ((AC + BC) < counter) {
//                    printAC = AC;
//                    printBC = BC;
//                }
                counter = Math.min((AC + BC), counter);
                break;
            }
        } while (o != origin);
    }

    public static void main(String[] args) throws IOException {
        a = sc.nextInt();
        b = sc.nextInt();

        AC = 0;
        BC = 0;
        printAC = 0;
        printBC = 0;
        o = 1;

        A(o);

        sc.write(counter == Integer.MAX_VALUE ? -1 : counter);
//        sc.write("\nAC: " + printAC + " BC: " + printBC); 
        sc.pw.flush();

    }


}


#我的求职思考#
全部评论
佬,现在到那步了,为什么我还是笔试中
点赞 回复 分享
发布于 2024-10-24 15:29 陕西
厉害
点赞 回复 分享
发布于 2024-10-21 21:27 北京

相关推荐

哈哈哈哈哈哈哈哈哈哈这个世界太美好了
凉风落木楚山秋:毕业出路老师不管,你盖个章他好交差就完事了,等你盖完毕业了就不关他事情了
点赞 评论 收藏
分享
来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
fRank1e:吓得我不敢去外包了,但是目前也只有外包这一个实习,我还要继续去吗
点赞 评论 收藏
分享
07-05 16:23
门头沟学院 Java
mengnankk:我投了300,约了5 6个面试。感觉项目写的太多了。一个项目就写五六个亮点,不是把整个项目的功能描述下。其他的没啥,简历看起来有点长
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务