从左往右尝试
数字转换成字符
1->a;2->b;3->c ……,给定一个数字字符串,计算所有可能.
如:给定的数值字符串为111,所有可能的结果是:
A|A|A
A|K
K|A
思路:
从左往右进行划分,有点类似按需进行排列。不断将字符串进行拆分尝试,在当前层拆分完之后,保留当前状态,进行下一层次的拆分。
/**
* 数字转换成字符
* 1-a 2->b 3->c
* 给定一个数字字符串,计算所有可能
*/
public static void convert(String numStr, String curBranchResults, List<String> allRes){
if(numStr.length() == 0){
allRes.add(curBranchResults.substring(1));
return;
}
for(int i=0;i< numStr.length();i++){
String sub = numStr.substring(0, i+1);
int wordNum = Integer.valueOf(sub);
String nexSubStr = "";
if(i+1 < numStr.length()){
nexSubStr = numStr.substring(i+1);
}
if(wordNum <= 26){
convert(nexSubStr, curBranchResults + "|" + convert(wordNum), allRes);
}else{
break;
}
}
}
public static String convert(int wordNum){
if(wordNum== 0){
return "";
}
return Character.valueOf((char) ('A' -1 + wordNum)).toString();
}
产品选择问题
给你一系类产品,你一个可以承受n重量的背包,让你从系列产品中选出重量最大的值。
思路:有点类似属性递归的套路题,考虑X步,选和不选的情况进行比较,往上层返回更大的值。
static class Produce{
int weight;
int value;
public Produce(int w, int v){
this.weight = w;
this.value = v;
}
}
public static int process(Produce[] produces, int i, int bag){
if(bag < 0){
return -1;
}
if(i >= produces.length){
return 0;
}
int v = produces[i].value;
int w = produces[i].weight;
//不选
int p1 = process(produces, i+1, bag);
//选
int p2 = process(produces, i+1, bag - w);
if(p2 == -1){
return p1;
}
return Math.max(p1, p2 + v);
}