// if each character in pattern is different // then each string in str should be different as well for (inti=0; i < 26; i++) { for (intj=0; j < 26; j++) { if (i != j && dict[i] != null && dict[j] != null && dict[i].equals(dict[j])) returnfalse; } } returntrue; }
classSolution { publicbooleanisHappy(int n) { Set<Integer> exist = newHashSet<>(); while (n > 1) { if (exist.contains(n)) { returnfalse; } exist.add(n); n = Square(n); } return n == 1; }
privateintSquare(int n) { intres=0; while (n > 0) { res += (n % 10) * (n % 10); n /= 10; } return res; } }
思路
使用一个 Set,如果 Set 已经包含了当前元素,说明发生循环了。就返回 false。
解答2[Java]:神奇的解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { publicbooleanisHappy(int n) { int d; while (n > 9) { d = n; n = 0; while (d > 0) { n += Math.pow(d % 10, 2); d = d / 10; } } return n == 1 || n == 7; } }
思路
这个是 1ms 的 sample submission。
最后使用了一个 1 和 7 来进行判断是因为如果是 Happy Number 就一定会经过 7 吗?不知道这背后的数学规律。
classSolution { public String minWindow(String s, String t) { int[] map = newint[128]; for (char c : t.toCharArray()) map[c]++; intcounter= t.length(), left = 0, right = 0, head = 0, d = Integer.MAX_VALUE; while (right < s.length()) { if (map[s.charAt(right++)]-- > 0) counter--; while (counter == 0) { if (right - left < d) d = right - (head = left); if (map[s.charAt(left++)]++ == 0) counter++; } } return d == Integer.MAX_VALUE ? "" : s.substring(head, head + d); } }
思路
注意 if (map[s.charAt(right++)]-- > 0) 这句,不论 right 指向位置的字符是哪个,在判断之后都会被减去 1。因为在前边的语句中,已经预先把 t 中的字符在 map 中加 1 了,所以只有不在 t 中的字符才会被减成负数。
同理,if (map[s.charAt(left++)]++ == 0) counter++; 如果判断为真,说明 left 指针指向的字符是 t 中的一个字符,且减去这个字符之后,这个字符的数量就不够了,因此需要把 counter 加1。如果 left 指向的不是 t 中的字符,那么这个字符在 map 中的值一定是负数,因为之前 right 遍历的时候被减过。