2017-12-22 7 views
1

이것은 정렬 된 배열이기 때문에 각 요소가 한 번만 나타나고 새 길이를 반환하도록 내부 복제본을 제거하십시오. 예를 들어 nums = [1,1,2]가 주어지면 함수는 [1,2]를 반환해야합니다.'value_type'유형의 널 포인터에 대한 참조 바인딩

아래 코드는 제 코드입니다. 나는 다른 모든 복제본을 지우고, 그 중 하나만 남겨 둡니다. 그러나 나는 항상 "value_type '유형의 null 포인터에 대한 참조 바인딩을 제출할 때 오류가 발생합니다. 누구든지 이걸 도와 주시면 고맙겠습니다!

class Solution { 
public: 
    int removeDuplicates(vector<int>& nums) { 
     int i = 0; 
     while(i < nums.size() - 1) { 
      if (nums[i] == nums[i + 1]) { 
       nums.erase(nums.begin() + i); 
      } 
      else i++; 
     } 
     return nums.size(); 
    } 
}; 
+0

복제 할 수 없습니다. https://ideone.com/ppuRg5. –

+0

오류 메시지를 표시하는 전체 프로그램을 표시하십시오. –

답변

2

vector<T>::size()는 부호없는 타입 size_t 타입의 값을 반환한다. 전달 된 벡터가 비어 있고 벡터의 길이가 0이라고 가정 해 보겠습니다. nums.size() - 1은 정수 언더 플로를 일으키고 실제로는 0과 매우 큰 양수를 비교합니다. 이것은 true로 평가되어 루프가 실행되고 i이 배열 경계를 통과합니다.

이 문제를 해결하려면 우선 nums.size()int 번으로 캐스팅하거나 크기를 정수 변수에 저장하고 비교하십시오.

+1

또는 'while (i + 1 Barmar

0

게시 된 기능은 벡터가 [1 1 2] 인 벡터에서 올바르게 작동합니다. https://ideone.com/ppuRg5을 참조하십시오.

그러나 내가 알기로 한 기능은 빈 벡터를 전달하면 문제가 발생한다는 것입니다.

while(i < nums.size() - 1) 

nums이 비어있는 경우 문제가됩니다. 빈 벡터 인 경우 함수에서 즉시 반환하여 문제를 미리 예방할 수 있습니다.

부호가있는 형식과 부호없는 형식을 비교하는 것에 대한 컴파일러 경고를 피하려면 i에 부호없는 형식을 사용하십시오.

int removeDuplicates(std::vector<int>& nums) { 
    if (nums.empty()) 
    { 
     return 0; 
    } 

    unsigned int i = 0; 
    while(i < nums.size() - 1) { 
     if (nums[i] == nums[i + 1]) { 
     nums.erase(nums.begin() + i); 
     } 
     else i++; 
    } 
    return nums.size(); 
} 
0

이 질문에 대한 답변이 아니라 당신이 당신의 벡터는 중복을 찾을 때마다 크기를 조정하지 않은 경우이 문제에 대한보다 효율적인 솔루션이 될 것입니다. 아이디어를 얻으려면 두 개의 반복자 i와 j를 가질 수 있습니다. 솔루션 벡터의 마지막 고유 요소의 인덱스를 유지하고 벡터를 반복합니다. j가 첫 번째 요소가 아닌 값을 가리킬 때이를 v [i]에 복사합니다. 그리고 일단 끝나면 j 번째부터 모든 것을 삭제하십시오.