Given a non-empty array of integers,every element appears three times except for one,
which appears exactly once.Find that single one.
Note:
Your algorithm should have a linear runtime complexity.Could you implement it without
using extra memory?
Example 1:
Input:[2,2,3,2]
Output:3
Example 2:
Input:[0,1,0,1,0,1,99]
Output:99
题目大意:
给定一个非空数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现一次的元素.
算法时间复杂度是线性的,并且不使用额外的辅助空间.
*/
package main
import (
"fmt"
"sort"
)
func singleNumber(nums []int)int{
sort.Ints(nums)
var i=2
for ;i<len(nums);i+=3{
if nums[i-2]!=nums[i-1]{
break
}
}
return nums[i-2]
}
func main(){
fmt.Println( "求数组中出现一次的元素")
nums:=[]int{0,1,0,1,0,1,99}
fmt.Println(singleNumber(nums))
}
/*
找出出现一次的元素,其余的都是三个.
(1)通过遍历数组获取所有元素的和以及set内元素的和,set容器不会添加重复的元素;
(2)(3*ans-sum)/2即可,除以2是因为我们减去之后得到的是2倍的目标元素;
*/
#include <iostream>
#include <vector>
#include <set>
#include <numeric>
using namespace std;
class Solution{
public:
int singlenumber(vector<int>& nums){
set<int> res;
for(auto& num:nums){
res.insert(num);
}
long sum=accumulate(nums.begin(),nums.end(),0),
ans=accumulate(res.begin(),res.end(),0);
return (int)(3*ans-sum)/2;
}
};
int main(int argc,char* argv[]){
vector<int> nums={0,1,0,1,0,1,99};
cout<<Solution().singlenumber(nums)<<endl;
return 0;
}