本周每日一题 题目
- lc1436. 旅行终点站
- lc405. 数字转换为十六进制数
- lc166. 分数到小数
10-01 lc1436. 旅行终点站
- 简单题,其实没什么好说的
- 比我想的还要简单,方法随便把,都行,做出来都行,没啥需要额外考虑的我感觉
- 思路是用set存放终点,然后再遍历,发现起点在set中的,就不是题目要求的终点,就直接删除,最终set中剩下的就是我们要的答案
class Solution {
public String destCity(List<List<String>> paths) {
if(paths==null) return "";
String res = "";
Set<String> set = new HashSet<>();
for(List<String> list: paths){
if(list.size()>0) set.add(list.get(list.size()-1));
}
for(List<String> list: paths){
for(int i=0; i<list.size()-1; i++){
String s = list.get(i);
if(set.contains(s)) set.remove(s);
}
}
for(String s:set) res = s;
return res;
}
}
10-02 lc405. 数字转换为十六进制数
public String toHex(int num) {
if (num == 0)
return "0";
char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
StringBuilder sb = new StringBuilder();
while (sb.length() < 8 && num != 0) {
sb.append(chars[num & 0xf]);
num >>= 4;
}
return sb.reverse().toString();
}
10-03 lc166. 分数到小数
- 这题还可以,麻烦在于边界,真的没必要,有点头重脚轻了,这里用long来解决边界溢出的问题
- 其中难点在于循环小数的判别,需要根据当前的被除数来看是否之前出现过
- 而题目也有意防水,说多个答案中返回一个就可以,所以我们将每次的被除数直接放到map中,当出现重复时,则必出现循环,则直接将括号插入两者之间,于是便可以完成循环小数部分的构建
- 然后关于求小数,就是当前数t*10再除以除数,就是当前小数位结果,余数就是下一位的被除数
- 整个题还是不错的,挺棒
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
StringBuilder intSb = new StringBuilder();
if(numerator!=0&&((numerator>0&&denominator<0)||(numerator<0&&denominator>0))) intSb.append('-');
long a = Math.abs((long)numerator);
long b = Math.abs((long)denominator);
long t = a % b;
intSb.append(a>=b?a/b:0);
if(t!=0) intSb.append('.');
StringBuilder decimalSb = new StringBuilder();
Map<Long,Integer> map = new HashMap<>();
int cnt = 0;
while(t!=0){
if(map.containsKey(t)){
decimalSb.insert((int)map.get(t),'(');
decimalSb.append(')');
break;
}
else map.put(t,cnt);
t = t*10;
long cur = t/b;
t = t%b;
decimalSb.append(cur);
cnt++;
}
intSb.append(decimalSb);
return intSb.toString();
}
}