1104. 二叉树寻路(中等)
解题思路:这道题明显的就是找规律,将label值除以2向下取整然后关于二叉树中间对折一下即为上一个节点的值,然后将该值赋值给label重复上面的步骤直到label为1即可。
例如:label为14,除以2后为7,取对称的那个值4;4除以2为2,取对称值为3;然后除以2等于1,最后得出答案为14-4-3-1,然后将这个反转为1-3-4-14,返回答案。
代码:
package LeetCode.Code2022.January;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Solution1104 {
public List<Integer> pathInZigZagTree(int label) {
List<Integer> ans = new ArrayList<>();
if (label == 1) {
ans.add(1);
return ans;
}
int num;
int level = getLevel(label);
ans.add(label);
while (level > 2){
level--;
num = label / 2;
int maxVal = (int) Math.pow(2, level) - 1;
int minVal = maxVal - (int) Math.pow(2, level - 1);
int midVal = minVal + ((maxVal - minVal) >> 1);
num = midVal + (midVal - num + 1);
ans.add(num);
label = num;
}
ans.add(1);
Collections.reverse(ans);
return ans;
}
int getLevel(int label) {
int level = 1;
while (Math.pow(2, level) - 1 < label) {
level++;
}
return level;
}
}
1716.计算力扣银行的钱(简单)
解题思路:找规律
代码:
package LeetCode.Code2022.January;
public class Solution1716 {
public int totalMoney(int n) {
int a = n / 7;
int b = n % 7;
if (b == 0) {
return (7 * a * a + 49 * a) / 2;
} else {
return (7 * a * a + 49 * a) / 2 + (2 * a + b + 1) * b / 2;
}
}
}
1436.旅行的终点站(简单)
解题思路:先遍历一遍paths,将cityBi加入到Set中(因为终点站只可能在这个地方出现),然后再次遍历paths,将出现在cityAi的城市从Set中删除,剩下的唯一一个即为终点站。
代码:
package LeetCode.Code2022.January;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Solution1436 {
public String destCity(List<List<String>> paths) {
Set<String> cities = new HashSet<>();
for (List<String> l : paths) {
// cities.add(l.get(0));
cities.add(l.get(1));
}
for (List<String> l : paths) {
cities.remove(l.get(0));
}
String ans = "";
for (String s : cities) {
ans = s;
}
return ans;
}
}
1446.连续字符
解题思路:统计最长的由单个字符构成的字符串长度。
代码:
package LeetCode.Code2022.January;
public class Solution1446 {
public int maxPower(String s) {
int maxSameLen = 1;
boolean flag = false;
for (int i = 1; i < s.length(); i++) {
int j = i;
while (i < s.length() && s.charAt(i - 1) == s.charAt(i)) {
i++;
flag = true;
}
if (flag) {
maxSameLen = Math.max(maxSameLen, i - j + 1);
i--;
flag = false;
}
}
return maxSameLen;
}
}