本周每日一题 题目
- 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. 数字转换为十六进制数
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