栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本周每日一题 题目
  • lc1436. 旅行终点站
  • lc405. 数字转换为十六进制数
  • lc166. 分数到小数
  • lc482. 密钥格式化
10-01 lc1436. 旅行终点站
  • 简单题,其实没什么好说的
  • 比我想的还要简单,方法随便把,都行,做出来都行,没啥需要额外考虑的我感觉
  • 思路是用set存放终点,然后再遍历,发现起点在set中的,就不是题目要求的终点,就直接删除,最终set中剩下的就是我们要的答案
class Solution {
    //找到没有下一跳的节点
    //两次遍历,第一遍把所有的最后一个元素加进set,然后再遍历,如果在其他中出现,就从set中删除,不是终点
    //最终set中剩余的就是终点
    //O(2n),其实也不算O(2n),算O(n)把
    public String destCity(List> paths) {
        if(paths==null) return "";
        String res = "";
        Set set = new HashSet<>();
        //将最后一个元素加入set
        for(List list: paths){
            if(list.size()>0) set.add(list.get(list.size()-1));
        }

        for(List list: paths){
            for(int i=0; i 
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 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();
    }
}
10-04 lc482. 密钥格式化
  • 今天是个简单题,也是非常简单的一道题
  • 给一个字符串,经过处理
  • 然后给k值,将字符串分成多个k字符的分组,第一个小于等于k,那么很简单,第一个直接是n%k就可以了,后面的全部是k,当然,如果结果是0,那么每个都是k,第一个就置为k
  • 简单题,直接看代码,不多bb
class Solution {
    //按照-来分割字符串,然后第一个分组小于等于k,至少有一个,后面的要刚好包含k个字符
    //然后因为只有字母,所以要转成大写,这个有api
    //也就是第一个至少有1,但是有多少是按照后面的整除的情况来的
    public String licenseKeyFormatting(String s, int k) {
        char[] ss = String.join("",s.split("-")).toUpperCase().toCharArray(); //去掉破折号,并转大写,转成char数组
        int n = ss.length;
        //每一个的数量
        int each = n%k==0?k:n%k; //初始为第一个的数量,后面置为k
        //重组
        StringBuilder sb = new StringBuilder();
        for(int i=0; i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号