找出数组中只出现一次的数字

8 篇文章 0 订阅
7 篇文章 0 订阅

题干:找出数组中只出现一次的数字——一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
      if (data.size()< 2) {
        return;
      }
      int resultofxor = 0;
      for (auto it = data.begin(); it != data.end(); it++) {
        resultofxor ^= *it;
      }
      int firstindex1 = 0;
      while (!(resultofxor & 1)) {
        firstindex1++;
        resultofxor = resultofxor >> 1;
      }
      *num1 = 0;
      *num2 = 0;
      for (auto it = data.begin(); it != data.end(); it++) {
        //如果it所指元素的firstindex1位为1,则划分到num1,否则划分到num2
        if (IsBit1(*it, firstindex1)) {
          *num1 ^= *it;
        }
        else {
          *num2 ^= *it;
        }
      }
    }

    bool IsBit1(int num, int index) {
      return (num >> index) & 1;
    }
};

int main(int argc, char const *argv[]) {
  int arr[8] = {2,4,3,6,3,2,5,5};
  std::vector<int> intvec(arr, arr+8);
  //初始化,num1, num2, 用new申请一块内存并初始化num1 num2
  int *num1 =new int;
  int *num2 =new int;
  Solution s;
  s.FindNumsAppearOnce(intvec, num1, num2);
  std::cout << *num1 << " " << *num2 << std::endl;
  delete num1;
  delete num2;
  return 0;
}

注意指针的初始化问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值