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

博客内容涉及三道LeetCode编程题目,包括lc1436旅行终点站的解决方案,通过两次遍历寻找旅行终点;lc405数字转换为十六进制数的实现,通过不断除以16得到结果;以及lc166分数到小数的转换,处理循环小数和溢出问题。博客详细解析了每道题目的思路和关键点。
摘要由CSDN通过智能技术生成

本周每日一题 题目

  • 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();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值