442 题目描述💥:
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]
示例 2:
输入:nums = [1,1,2]
输出:[1]
示例 3:
输入:nums = [1]
输出:[]
解题思路💥:
根据题目要求 使用额外的空间来解决
我们开辟一个空间大小相等的数组
遍历一遍数组
如果有重复的元素就add到list中
最后以数组方式返回就行
代码附上💥:
class Solution { public List<Integer> findDuplicates(int[] nums) { List<Integer>list =new ArrayList<>(); int arr[]=new int [nums.length]; for(int i=0;i<nums.length;i++){ if(nums[i]==arr[nums[i]-1]){ list.add(nums[i]); }else{ arr[nums[i]-1]=nums[i]; } } return list; } }
2283题目描述💥:
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]
示例 2:
输入:nums = [1,1,2]
输出:[1]
示例 3:
输入:nums = [1]
输出:[]
解题思路💥:
这道题直接统计数字出现的次数即可
遍历统计数字出现的次数
如果下标i满足在num中出现了num[i]次 那么就返回true 反之返回false
代码附上💥:
class Solution { public boolean digitCount(String num) { int len=num.length(); int []map=new int [10]; for(int i=0;i<len;i++){ //统计数字出现的次数 map[num.charAt(i)-'0']++; } for(int i=0;i<len;i++){ if(map[i]!=num.charAt(i)-'0') return false; } return true; } }
884题目描述💥:
句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。
如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。
给你两个 句子 s1 和 无序列表s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。
示例 1:
输入:s1 = "this apple is sweet", s2 = "this apple is sour"
输出:["sweet","sour"]
示例 2:
输入:s1 = "apple apple", s2 = "banana"
输出:["banana"]
解题思路💥:
创建一个字符串数组用来拼接两个字符串
用哈希表映射统计每个字符串出现的次数
对哈希表进行一遍遍历 把所有值为1的键放入
如果出现的次数为1 就是题目说的唯一的不常见字符串
代码详解💥:
class Solution { public String[] uncommonFromSentences(String s1, String s2) { //创建一个字符串数组将两个字符串拼接起来 String []AB=(s1+" "+s2).split(" "); //计算每个字符串出现的次数 Map<String,Integer>map=new HashMap<>(); for(int i=0;i<AB.length;i++){ map.put(AB[i],map.getOrDefault(AB[i],0)+1); } //如果出现的次数为1 就是题目说的唯一的不常见字符串 List<String>list=new ArrayList<>(); for(String key:map.keySet()){ if(map.get(key)==1){ list.add(key); } } String []res=new String[list.size()]; return list.toArray(res); } }
2068 题目描述💥:
如果两个字符串 word1 和 word2 中从 'a' 到 'z' 每一个字母出现频率之差都 不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。
给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等 ,请你返回 true ,否则返回 false 。
一个字母 x 的出现 频率 指的是它在字符串中出现的次数。
示例 1:
输入:word1 = "aaaa", word2 = "bccb"
输出:false
解释:字符串 "aaaa" 中有 4 个 'a' ,但是 "bccb" 中有 0 个 'a' 。
两者之差为 4 ,大于上限 3 。
示例 2:
输入:word1 = "abcdeef", word2 = "abaaacc"
输出:true
解释:word1 和 word2 中每个字母出现频率之差至多为 3 :
- 'a' 在 word1 中出现了 1 次,在 word2 中出现了 4 次,差为 3 。
- 'b' 在 word1 中出现了 1 次,在 word2 中出现了 1 次,差为 0 。
- 'c' 在 word1 中出现了 1 次,在 word2 中出现了 2 次,差为 1 。
- 'd' 在 word1 中出现了 1 次,在 word2 中出现了 0 次,差为 1 。
- 'e' 在 word1 中出现了 2 次,在 word2 中出现了 0 次,差为 2 。
- 'f' 在 word1 中出现了 1 次,在 word2 中出现了 0 次,差为 1 。
示例 3:
输入:word1 = "cccddabba", word2 = "babababab"
输出:true
解释:word1 和 word2 中每个字母出现频率之差至多为 3 :
- 'a' 在 word1 中出现了 2 次,在 word2 中出现了 4 次,差为 2 。
- 'b' 在 word1 中出现了 2 次,在 word2 中出现了 5 次,差为 3 。
- 'c' 在 word1 中出现了 3 次,在 word2 中出现了 0 次,差为 3 。
- 'd' 在 word1 中出现了 2 次,在 word2 中出现了 0 次,差为 2 。
解题思路💥:
创建一个26大小空间的数组 用来存'a'-'z'字母的次数
遍历word1 和word2两个字符串
第一个字符串出现就++,第二个出现就--
最后判断绝对值如果超过3就返回false 反正返回true!
代码附上💥:
class Solution { public boolean checkAlmostEquivalent(String word1, String word2) { int res[]=new int[26]; //统计字符'a'到字符'z'出现的次数 for(char c1:word1.toCharArray()){ res[c1-'a']++; } for(char c2:word2.toCharArray()){ res[c2-'a']--; } // for(int i=0;i<word1.length();i++){ // res[word1.charAt(i)-'a']++; // } // for(int i=0;i<word2.length();i++){ // res[word2.charAt(i)-'a']--; // } for(int i=0;i<26;i++){ if(Math.abs(res[i])>3){ return false; } } return true; } }