21年10月第一周 力扣每日一题记录

本周每日一题 题目

  • lc1436. 旅行终点站
  • lc405. 数字转换为十六进制数
  • lc166. 分数到小数

10-01 lc1436. 旅行终点站

  • 简单题,其实没什么好说的
  • 比我想的还要简单,方法随便把,都行,做出来都行,没啥需要额外考虑的我感觉
  • 思路是用set存放终点,然后再遍历,发现起点在set中的,就不是题目要求的终点,就直接删除,最终set中剩下的就是我们要的答案
class Solution {
    
    
    //找到没有下一跳的节点
    //两次遍历,第一遍把所有的最后一个元素加进set,然后再遍历,如果在其他中出现,就从set中删除,不是终点
    //最终set中剩余的就是终点
    //O(2n),其实也不算O(2n),算O(n)把
    public String destCity(List<List<String>> paths) {
    
    
        if(paths==null) return "";
        String res = "";
        Set<String> set = new HashSet<>();
        //将最后一个元素加入set
        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. 数字转换为十六进制数

  • 之前做过这题,没啥好说的,一直除以16就行了
	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 {
    
    
    //就是一个除法
    //比如1/6,首先整数位为0,因为数1小于数2
    //然后10/6,得到的是1,余4,然后40除以6,得到的是6,如此计算
    //但会遇到问题,像4/333这种的012循环怎么整,怎么判断这种循环
    //同时符号也得考虑
    //这里循环怎么考虑啊
    //0.1(6)这种呢,你根本没法判断循环啊
    //哦,因为除数相同,所以只要t没变,则一定是重复了,那这两个数前分别加上左括号和右括号即可
    //又因为题意说存在多个答案,所以这里只要一个就好,这里是降低了难度的
    //还有数据会溢出的问题
    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();
    }
}

Guess you like

Origin blog.csdn.net/qq_34687559/article/details/120600899