已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。
请返回只出现了 1 次的数。
数据范围: , ,
进阶:时间复杂度 ,空间复杂度
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr int一维数组 * @param k int * @return int */ public int foundOnceNumber (int[] arr, int k) { // write code here int n=arr.length; if(k%2==0){ //偶数 int ans=0; for(int i=0;i<n;i++){ ans^=arr[i]; } return ans; } else{ Map<Integer,Integer> hashmap=new HashMap(); for(int i=0;i<n;i++){ hashmap.put(arr[i],hashmap.getOrDefault(arr[i],0)+1); } for(Map.Entry<Integer,Integer> entry:hashmap.entrySet()){ if(entry.getValue()==1) return entry.getKey(); } } return -1; } }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr int一维数组 * @param k int * @return int */ public int foundOnceNumber (int[] arr, int k) { // write code here int n=arr.length; int[] ans=new int[32]; for(int i=0;i<n;i++){ for(int j=0;j<32;j++){ ans[j]+=arr[i]&1; arr[i]>>>=1; } } int res=0; for(int i=0;i<32;i++){ res<<=1; res|=ans[31-i]%k; } return res; } }
//方法一:利用Map集合 /* Map<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < arr.length; i++) { if (!map.containsKey(arr[i])) map.put(arr[i],1); else map.put(arr[i],map.get(arr[i]) + 1); } int res = 0; for (int key : map.keySet()){ if (map.get(key) == 1){ res = key; } } return res; */ //方法二:同时利用List、Set两个集合 /* List<Integer> list = new ArrayList<>(); Set<Integer> set = new HashSet<>(); for (int i = 0; i < arr.length; i++) { if (!list.contains(arr[i])) { list.add(arr[i]); set.add(arr[i]); } else set.remove(arr[i]); } int res = 0; for (int ele : set){ res = ele; } return res; */ //方法三:利用数组 ///* Arrays.sort(arr); for (int i = 1; i < arr.length - 1; i++) { if (arr[i] != arr[i - 1] && arr[i] != arr[i + 1]) return arr[i]; } if (arr[0] != arr[1]) return arr[0]; else return arr[arr.length - 1]; //*/ //方法四:两层暴力for循环(思路上可行,但时间复杂度o(n^2),可能运行超时) /* for (int i = 0; i < arr.length; i++) { int count = 0; for (int j = 0; j < arr.length; j++) { if (arr[i] == arr[j]) count++; } if (count == 1) return arr[i]; } return -1; */
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr intvector * @param k int * @return int */ int foundOnceNumber(vector<int>& arr, int k) { // write code here sort(arr.begin(),arr.end()); int i = 1; for (; i < arr.size() - 1; i += k - 1) { if (arr[i - 1] != arr[i] && arr[i] != arr[i + 1]) { return arr[i]; } } return arr[arr.size() - 1]; } };
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr int一维数组 * @param k int * @return int */ public int foundOnceNumber (int[] arr, int k) { for(int i=0;i<arr.length;i++){ int count=0; for(int j=0;j<arr.length;j++){ if(arr[i]==arr[j]){ count++; } } if(count==1){ return arr[i]; } } return -1; } }
//暴力破解 import java.util.*; public class Solution { public int foundOnceNumber (int[] arr, int k) { // write code here for(int i=0;i<arr.length;i++) {int count=0; for(int j=0;j<arr.length;j++) { if (arr[i]==arr[j]) count++; } if(count==1) { return arr[i]; } } return -1; } }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr intvector * @param k int * @return int */ int foundOnceNumber(vector<int>& arr, int k) { // write code here //哈希表 // unordered_map<int, int> unmap; // for(auto a : arr){ // unmap[a]++; // } // for(auto m : unmap){ // if(m.second == 1){ // return m.first; // } // } // return -1; //位运算 int res = 0; for(int i = 0; i < 32; i++){ int count = 0; for(auto a : arr){ if(a&(1<<i)) ++count; } if(count % k == 1) res ^= (1 << i); } return res; } };
function foundOnceNumber( arr , k ) { // write code here //计算每一位上出现1的个数,%k得到出现一次的数 let res = 0; for(let i=0;i<32;++i){ let sum =0; for(let num of arr){ //用无符号右移,防止正负号的影响 //依次右移num,同1相与,计算每一位上1的个数 sum+=(num>>i)&1 } //对sum取余,左移恢复 res^=(sum%k)<<i } return res }
class Solution: def foundOnceNumber(self , arr , k ): arr.sort() for i in range(0,len(arr)-1,k): if arr[i]==arr[i+1]: i+=k-1 else: return arr[i] return arr[len(arr)-1]
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr intvector * @param k int * @return int */ int foundOnceNumber(vector<int>& arr, int k) { // write code here //哈希表解法 unordered_map<int,int>map_; sort(arr.begin(),arr.end()); for(int i=0;i<arr.size();i++) { map_[arr[i]]++; } for(auto[a,b]:map_) if(b==1)return a; return 0; } };
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param arr intvector * @param k int * @return int */ int foundOnceNumber(vector<int>& arr, int k) { // 思路 // 统计每一位上1出现的次数,然后模k,剩下的余数就是只出现一次的数的对于的位 vector<int> cnt(32, 0); for(auto num : arr) { for(int i = 0; i < 32; ++i) { int mask = 1 << i; if(num & mask) { cnt[i]++; } } } int ans = 0; for(int i = 0; i < 32; ++i) { if(cnt[i]%k) { ans |= (1 << i); } } return ans; } };
function foundOnceNumber( arr , k ) { arr.sort() for(let i=0;i<arr.length;i++){ if(arr[i]!=arr[i-1] && arr[i]!=arr[i+1]) return arr[i] } }
public int foundOnceNumber (int[] arr, int k) { // write code here Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i< arr.length; i++){ map.put(arr[i], map.getOrDefault(arr[i],0) + 1); } for (Map.Entry<Integer, Integer> entry : map.entrySet()) { if(entry.getValue() == 1) return entry.getKey(); } return 0; }
#include <unordered_map> class Solution { public: int foundOnceNumber(vector<int>& arr, int k) { unordered_map<int, int>hash; int ans; for (int i = 0; i < arr.size(); i++) { hash[arr[i]]++; } for ( auto i : hash) { if (i.second == 1) { ans = i.first; } } return ans; } };