题目一描述:
电话的数字键对应英文字母的26个字符,返回所有它能表示的字母组合,给出数组到字母的映射如下,数字1不对应任何字母。题目对于小白来说有点难,因此参考别人的程序,需要多多复习一下。
传送门
题目一分析:
对于需要匹配的字符需要将数字与字符串进行相关的编码映射,因此使用map将自己的数字与数字对应的字符串进行相关的匹配。然后进行递归回溯进行将所有的数字对应的字符串拼接在一起
代码如下:
class Solution {
List<String> list = new ArrayList<>();
Map<String,String> map = new HashMap<String,String>(){
{
put("2","abc");
put("3","def");
put("4","ghi");
put("5","jkl");
put("6","mno");
put("7","pqrs");
put("8","tuv");
put("9","wxyz");
}
};
//循环的起始位置,将初始的字符串传入递归函数中
public List<String> letterCombinations(String digits) {
if(digits.length()!=0)
pinString("",digits);
return list;
}
//递归函数,第一个位置为拼接的字符串第二个位置为下一个数字字符串的位置
public void pinString(String combination,String digits){
//递归结束的条件,当前数字的长度为0直接将拼接的字符串传入集合中
if(digits.length()==0){
list.add(combination);
return;
}else{
//将数字的第一个位置产分出来
String tempnum = digits.substring(0,1);
//获取该位置对应的字符串,例如2对应的是abc
String dic = map.get(tempnum);
//当前数字对应的位置一次遍历,回溯时选择下一个位置
for(int i=0;i<dic.length();i++){
//将当前位置的字符串拆分下来,进行拼接后传入去掉当前数字的剩余数字
String tmpdic = dic.substring(i,i+1);
pinString(combination+tmpdic,digits.substring(1));
}
}
}
}
题目二描述:
将十进制的数字转换成十六进制的数字,包括正数与负数,负数使用补码形式
题目二分析:
个人使用的是一个常数级别额外的控件将大于十的数字对应的字符存放在一个集合中,如果是负数使用其补码将其转换成一个正整数进行处理,正整数采用短除法取余数直到商为0,然后将余数从底向上返回即为答案。
代码如下:
class Solution {
//将大于十的数字对应的字符放在一个map中进行存储
Map<String,String> map = new HashMap<>(){
{
put("10","a");
put("11","b");
put("12","c");
put("13","d");
put("14","e");
put("15","f");
}
};
public String toHex(int num) {
//该方式是将数字的模创建出来,即将1左移32位
long basic = (1l << 32);
if (num == 0)
return "0";
//创建一个串用于拼接
StringBuilder sb = new StringBuilder();
long longnum = 0l;
//对于负数使用模+负数即为正整数的转换
if (num < 0)
longnum = (basic + num);
else
longnum = num;
//对于正整数进行短除法进行处理
while (longnum != 0) {
long temp = longnum % 16;
String str = String.valueOf(temp);
if (map.containsKey(str)) {
sb.append(map.get(str));
} else
sb.append(temp);
longnum = longnum / 16;
}
//将字符串反转
return sb.reverse().toString();
}
}