1791. 找出星型图的中心节点【简单题】
思路:
- 因为各个点不重复,而edges表示的是两个端点连接的线,那么这些线中心节点必然会在这些线段中重复出现,也只有中心节点会重复出现,所以只要中心有端点出现至少2次,那么这个点肯定是中心节点。
- 定义一个哈希set用来存储这些线段的端点,只要有端点重复,那么直接返回这个节点,否则就将这个端点添加进set中遍历下一条线段。
代码:
class Solution {
public int findCenter(int[][] edges) {
Set<Integer> set = new HashSet<>();
for (int[] edge : edges) {
if (!set.add(edge[0])){
return edge[0];
}
if (!set.add(edge[1])){
return edge[1];
}
}
return 0;
}
}
用时:
目前还无官方题解。
1790. 仅执行一次字符串交换能否使两个字符串相等【简单题】
思路:
- 定义一个列表list用来统计两个字符串不相等的字符位置。
- 因为两个字符串长度相同,因此使用普通for循环可以同时遍历两个字符串,如果同一个位置两个字符串的字符不同,将当前位置添加到list中,添加完如果发现list的长度已经大于2了,那么说明此时两个字符串至少已经有3个字符位置不同了,不可能通过一次字符串交换就能使两个字符串相等,所以此时直接返回false。
- 字符串遍历结束之后,如果list的长度依然为0,那么说明此时两个字符串完全相同,那么我任意交换两个字符串同一个位置的字符,之后两个字符串肯定依然相等,满足题意,所以此时直接返回true。
- 如果list的长度为1,那么此时两个字符串只有一个位置字符不同,其他位置字符全部相同无法交换,那么此时一定无法通过一次字符串交换使两个字符串相等,于是返回false。
- 排除掉list的长度为0,为1的情况,那么list的长度就只能为2了(大于2的情况在第2步遍历两个字符串的时候就已经排除掉了,能走到遍历结束说明list的长度肯定是小于等于2的),那么此时如果s1的list【0】位置的字符与s2的list【1】位置的字符相等且s1的list【1】位置字符与s2的list【0】位置字符相等,那么说明这两个字符串的两个不相等字符可以通过交换使两个字符串相等,满足题意,返回true,否则返回false。
代码:
class Solution {
public boolean areAlmostEqual(String s1, String s2) {
List<Integer> list = new ArrayList<>();
int len = s1.length();
for (int i = 0; i < len; i++) {
if (s1.charAt(i) != s2.charAt(i)){
list.add(i);
}
if (list.size()>2){
return false;
}
}
if (list.size() == 0){
return true;
}
if (list.size() == 1){
return false;
}
return (s1.charAt(list.get(0)) == s2.charAt(list.get(1))) && (s1.charAt(list.get(1)) == s2.charAt(list.get(0)));
}
}
用时:
目前还无官方题解。
注:
今天每日一题之前写过了,详见
1189. “气球” 的最大数量
今天重新写的思路和上次不太一样,不过性能也没提升,就不在本文再写一遍了。