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();
}
}
#我的求职思考#

