LeetCode [66/67/69] 더하기 1, 이진 합계, x의 제곱근 C/C++ - 5일차

66. 플러스 원

제목 설명 [단순]:
비어 있지 않은 정수 배열로 표현되는 음수가 아닌 정수가 주어지면 숫자에 1을 더합니다.

가장 높은 숫자는 배열의 맨 앞에 저장되며 배열의 각 요소는 단일 숫자만 저장합니다.

이 정수는 정수 0이 아닌 다른 0으로 시작하지 않는다고 가정할 수 있습니다.

번역:
배열의 각 비트는 한 자리이므로 0-9의 한 자리만 될 수 있으며 전체 숫자는 앞에 0이 없어 배열의 첫 번째 숫자가 0이 아니어야 함을 의미하며 지불 주의, like [9,9 ] 출력은 [1,0,0]입니다.

예 1:
입력: 숫자 = [1,9,9,]
출력: [2,0,0]
설명: 입력 배열은 숫자 199를 나타냅니다.

생각[폭력]:

숫자 배열을 뒤에서 앞으로 순회합니다. 9를 만나면 0이 되고, 9를 만나지 않으면 +1이 됩니다. 모두 올림이면 새로운 배열을 구성하고 for 이후에는 모두 0이 되도록 한다.

C++ 코드:

class Solution {
    
    
public:
    vector<int> plusOne(vector<int>& digits) {
    
    
        for(int i = digits.size() - 1 ; i >= 0 ; i--){
    
    
            if(digits[i] == 9){
    
    
                digits[i] = 0 ;
            }
            else {
    
    
                digits[i] += 1;
                return digits ;
            }
        }
           //如果所有位都是进位,则长度+1
        vector<int> digit(digits.size() + 1);//构造一个新的数组
        digit[0] = 1;//在第一个for的基础上全是0,现在让他的最高位即digit[0]=1即可。
        return digit;
    }
};

결과:
결과

67. 이진 합계

제목 설명 [단순]:
두 개의 이진 문자열이 주어지면 합계를 반환합니다(이진 표현으로).

입력은 숫자 1과 0만 포함하는 비어 있지 않은 문자열입니다.

예 1:
입력: a = "11", b = "1"
출력: "100"

아이디어:

바이너리 캐리 코어는 완전한 바이너리 캐리 원입니다.

1. 두 문자열의 길이를 동일하게 만들고 길이가 같지 않으면 짧은 문자열 앞에 0을 채웁니다.
2. 뒤에서 앞으로 모든 숫자를 트래버스하고 동일한 비트를 추가합니다. (문자의 덧셈은 아스키코드를 사용할 수 있다. 문자는 내부적으로 숫자로 표현된다. 구체적인 값을 알 필요는 없지만 0 - 0 = 0, 0 + 1 = 1로 알고 있다) 문자의 덧셈과 뺄셈은 실제로 내부 숫자 덧셈과 뺄셈.
3. 추가된 문자를 판단하여 2보다 크거나 같으면 다음 숫자를 1로 입력해야 합니다.

0번째 숫자의 추가는 문자 ​​삽입(즉, 앞에 숫자 1을 추가해야 하는지 여부)이 포함될 수 있으므로 여기서 별도로 처리합니다.

C++ 코드:

class Solution {
    
    
public:
    string addBinary(string a, string b) {
    
    
         int al = a.size();
        int bl = b.size();
        while(al < bl) //让两个字符串等长,若不等长,在短的字符串前补零
        {
    
    
            a = '0' + a;
            ++ al;
        }
        while(al > bl)
        {
    
    
            b = '0' + b;
            ++ bl;
        }
        for(int j = a.size() - 1; j > 0; -- j) //从后到前遍历所有的位数,同位相加
        {
    
    
            a[j] = a[j] - '0' + b[j];
            if(a[j] >=  '2') //若大于等于字符‘2’,需要进1
            {
    
    
                a[j] = (a[j] - '0') % 2 + '0';
                a[j-1] = a[j-1] + 1;
            }
        }
        a[0] = a[0] - '0' + b[0]; //将a、b的第0位相加
        if(a[0] >= '2') //若大于等于2,需要进1
        {
    
    
            a[0] = (a[0] - '0') % 2 + '0';
            a = '1' + a;
        }
        return a;

    }
};

이 질문의 알고리즘은 사실 그다지 좋지는 않지만 뒤집는 방법을 잘 이해하지 못하기 때문에 가장 이해하기 쉽습니다. 그래서 제가 잘 이해하는 코드를 작성했습니다.

69.x의 제곱근

제목 설명 [단순]:
음이 아닌 정수 x가 주어졌을 때 x의 산술 제곱근을 계산하여 반환합니다.
리턴 타입이 정수이기 때문에 결과의 정수 부분만 유지되고 소수 부분은 버려집니다.

예 1:
입력: x = 8
출력: 2
설명: 8의 산술 제곱근은 2.82842…입니다. 반환 유형이 정수이므로 소수 부분은 반올림됩니다.

아이디어[이진 검색]:

x의 제곱근의 정수 부분 res는 k^2 ≤ x를 만족하는 가장 큰 k 값이므로 k에 대해 이진 검색을 수행하여 답을 얻을 수 있습니다.

이진 검색의 하한은 0이고 상한은 대략 x로 설정할 수 있습니다. 이진 검색의 각 단계에서 중간 요소 mid의 제곱과 x의 크기 사이의 관계를 비교하고 비교 결과에 따라 상한 및 하한의 범위를 조정하기만 하면 됩니다.

C++ 코드

class Solution {
    
    
public:
    int mySqrt(int x) {
    
    
        int left = 0, right = x, res = -1;
        while (left <= right) {
    
    
            int mid = left + (right - left) / 2;
            if ((long long)mid * mid <= x) {
    
    
                res = mid;
                left = mid + 1;
            } else {
    
    
                right = mid - 1;
            }
        }
        return res;
    }
};

결과 분석:
알고리즘 분석

시간 복잡도: O(\log x)O(logx), 이진 검색에 필요한 횟수.

추천

출처blog.csdn.net/Lailalalala/article/details/126064801