면접 문제 56 - I 수조 에서 숫자 가 나 오 는 횟수

6187 단어 면접 알고리즘
제목
한 배열 은 두 개의 숫자 가 한 번 만 나타 나 고 다른 숫자 는 두 번 나타 나 는데 어떻게 O (N) 의 복잡 도, O (1) 의 공간 복잡 도 상황 에서 이 두 개의 숫자 를 구 합 니까?
사고의 방향
이 문 제 는 전에 학교 경 기 를 할 때 해 본 적 이 있 습 니까? 아니면 아주 간단 합 니까? 다른 성질 로 우 리 는 쉽게 알 수 있 습 니 다. 모든 숫자 를 다 다 르 거나 한 번, 답 은 res = a ^ b (그 두 개의 단독 숫자의 차이 점 또는) 입 니 다. 그러면 이 res 를 어떻게 활용 합 니까?이 문 제 는 배열 을 열 수 없 기 때문에 데이터 구조 나 특정한 알고리즘 의 측면 에서 고려 할 수 없습니다. 그러면 비트 연산 으로 이 res 의 바 이 너 리 를 펼 치 는 것 을 고려 하고 res 의 특정한 바 이 너 리 를 1 로 선택 하면 a 와 b 의 차 이 는 a 와 b 의 바 이 너 리 가 이 자리 에서 다 르 면 전체 배열 로 확 장 됩 니 다.우 리 는 전체 배열 의 수 를 고려 하여 이 자리 에서 0 과 1 의 두 가지 로 나 눌 수 있다. 이 두 가지 유형 은 각자 의 차이 점 이나 화 해 를 구 하 는 것 이 바로 단독 적 인 두 개의 수 이다.
코드
class Solution {
     
public:
    vector<int> singleNumbers(vector<int>& nums) {
     
        int len=nums.size();
        int res=0;
        for (int i=0;i<len;i++){
     
            res=res^nums[i];
        }
        int bit=0;
        for (int j=0;j<32;j++){
     
            if((res>>j)&1==1){
     
                bit=j;
                break;
            }
        }
        int a=0;
        for (int i=0;i<len;i++){
     
            if((nums[i]>>bit)&1){
     
                a=a^nums[i];
            }
        }
        vector<int>ans;
        ans.push_back(a);
        ans.push_back(res^a);
        return ans;
    }
};

좋은 웹페이지 즐겨찾기