第一题我没做出来,说来惭愧,菜的离谱。看大神的题解豁然开朗,这题类似之前做过的数青蛙那道题,果然还是太菜了,因为出发城市和终点城市必然是一条路径的起点和终点。举例子说明:
A-B-C-D-E
其中包含的实际path应该是A-B,B-C,C-D,D-E,这四组,我们使用map进行套环即可,将这些城市依次加入map,然后记得出发城市如果在map中没出现过,则+1,但是如果终点城市在map中出现过,则获取其出现的次数-1,把二者反过来也可以。我们以上述A-B-C-D-E为例,写一下过程
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200503145644580.png)
终点城市必然只在后面出现,且只出现一次,也就是E,其值为-1,其余的BCD最后一次的值都变为了0,因为在出发城市变为1,在终点城市再次出现时需要-1,因此变为0,只有最后的终点,只出现一次,他的值为-1。据此配合map来写即可。
3. 第二题很简单,找出所有的1,然后比较其索引差值即可。看到有大佬的转化为字符串的做法,自愧不如,神仙思路。把只有1和0的数字转化为字符串,然后用1进行分割,再看分割后的字符串数组中的0的个数,也就是字符串的长度和k作比较,结束。
class Solution {
public String destCity(List<List<String>> paths) {
if (paths == null || paths.size() == 0) {
return "";
}
Map<String, Integer> map = new HashMap<>();
for (List<String> path : paths) {
map.put(path.get(0), map.getOrDefault(path.get(0), 0) - 1);
map.put(path.get(1), map.getOrDefault(path.get(1), 0) + 1);
}
for (List<String> path : paths) {
if (map.get(path.get(1)) == 1) {
return path.get(1);
}
}
return "";
}
}
class Solution {
public boolean kLengthApart(int[] nums, int k) {
// 将所有的1的索引存入list
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 1) {
list.add(i);
}
}
// 将数组中的数,也就是这些索引进行双层遍历比对,是否都大于k,大于返回true,否则返回false
int size = list.size();
for (int j = size - 1; j > 0; j--) {
if (list.get(j) - list.get(j - 1) <= k) {
return false;
}
}
return true;
}
}