242、有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
判断map2.get(ch)和map1.get(ch)是否相等应该用equals,因为是Integer对象的,不然会出现错误。
即:正确用法:!map2.get(c).equals(map1.get(c))
错误用法:map2.get(ch)!=map1.get(ch)
判断相等:万金油equals !!!
法一:哈希表
class Solution {
public boolean isAnagram(String s, String t) {
Map<Character,Integer> map1=new HashMap<>();
Map<Character,Integer> map2=new HashMap<>();
for(int i=0;i<s.length();i++){
char ch=s.charAt(i);
if(!map1.containsKey(ch)){
map1.put(ch,1);
}else{
map1.put(ch,map1.get(ch)+1);
}
}
for(int i=0;i<t.length();i++){
char ch=t.charAt(i);
if(!map2.containsKey(ch)){
map2.put(ch,1);
}else{
map2.put(ch,map2.get(ch)+1);
}
}
if(map1.size()!=map2.size()){
return false;
}
for(Character c:map1.keySet()){
if(!map2.containsKey(c)){
return false;
}else if(map2.containsKey(c)&&!map2.get(c).equals(map1.get(c))){
return false;
}
}
return true;
}
}
法二:数组排序
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}
}
官方哈希表做法
注意:getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。
table.getOrDefault(ch, 0) 找到ch对应的value,如果找不到,就返回value为0
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
Map<Character, Integer> table = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
table.put(ch, table.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < t.length(); i++) {
char ch = t.charAt(i);
table.put(ch, table.getOrDefault(ch, 0) - 1);
if (table.get(ch) < 0) {//如果有出现<0 说明肯定有一个字符是t特有的,不满足题目要求
return false;
}
}
return true;
}
}
268、丢失的数字
给定一个包含 [0, n]
中 n
个数的数组 nums
,找出 [0, n]
这个范围内没有出现在数组中的那个数。
法一:List集合——时间复杂度O(n)
class Solution {
public int missingNumber(int[] nums) {
List<Integer>list=new ArrayList<>();
for(int i=0;i<nums.length;i++){
list.add(nums[i]);
}
for(int i=0;i<nums.length+1;i++){
if(!list.contains(Integer.valueOf(i))){
return i;
}
}
return -1;
}
}
法二:位运算(与136、只出现一次的数字有相似的思路)——时间复杂度O(n)
int res=num.length;是因为:
1)所有数字出现两次,异或将使它归零。
2)下标i是从0~nums.length-1的,而数字是从0~nums.length的(缺了一个)。
3)你需要将初始值,设置为下标不能达到的那个值,即nums.length
就是缺的那一个数必不可能是数组【0,n】共n
个数里的n
class Solution {
public int missingNumber(int[] nums) {
int res=nums.length;
for(int i=0;i<nums.length;i++){
res=res^nums[i]^i;
}
return res;
}
}
法三:数组排序后逐个比较 时间复杂度O(nlogn)
class Solution {
public int missingNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 0; i < nums.length; i++){
if(nums[i] != i) return i;
}
return nums.length;
}
}
342、4的幂
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4^x
class Solution {
public boolean isPowerOfFour(int n) {
if(n<=0) return false;
if(n==1) return true;
while(n>1){
if(n%4!=0){
return false;
}
n=n/4;
}
return true;
}
}