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();

    }


}


#我的求职思考#
全部评论
厉害
点赞 回复 分享
发布于 昨天 21:27 北京

相关推荐

投递4399游戏等公司10个岗位
点赞 评论 收藏
分享
1 2 评论
分享
牛客网
牛客企业服务