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), 이진 검색에 필요한 횟수.