已知 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;
}
};