Оглавление
66. Плюс один
Учитывая неотрицательное целое число, представленное непустым массивом целых чисел, добавьте единицу к числу.
Старшая цифра хранится в начале массива, и каждый элемент массива хранит только одно число.
Вы можете предположить, что это целое число не будет начинаться с нуля, отличного от целого числа 0.
Пример 1:
Ввод: цифры = [1,2,3]
Вывод: [1,2,4]
Объяснение: Входной массив представляет цифру 123.
Пример 2:Ввод: цифры = [4,3,2,1]
Вывод: [4,3,2,2]
Объяснение: Входной массив представляет цифру 4321.
Пример 3:ввод: цифры = [0]
вывод: [1]
Источник: LeetCode
Ссылка: https://leetcode.cn/problems/plus-one
ход мыслей
Сначала нам нужно понять смысл вопроса, это обработка переданного массива как числа ,
Например, [4,3,2,1] равно 4321 , а затем добавьте к этому числу единицу, чтобы получить 4322 , а затем преобразуйте число после добавления единицы в массив, чтобы оно стало [4,3,2, 2]
В этом случае мы должны рассмотреть ситуацию переноса ( например, [9,9] --> 99 --> +1 --> 100 --> [1,0,0])
один.
1. Затем нам нужно сначала создать пространство для хранения нового массива, потому что существует ситуация переноса (например, 99), поэтому позиция должна быть на единицу больше, чем исходный массив (digitsSize + 1)
2. Затем не забудьте набрать количество возвратов в это время (первый пришел и унес)
3. Затем мы сначала присваиваем весь массив новому пространству, не забывая оставить бит p[0] (резерв для переноса) (доступны следующие два цикла)
ps: (я должен начинать с 0, потому что массив цифр помещается в p, и я в основном представляет нижний индекс цифр)
два.
1. Присвоить 0 p[0]
2. Поскольку он добавляется сзади, нижний индекс находится сзади (i = digitsSize).
3. p[i] = (p[i] + 1)%10 Этот шаг завершает добавление , требуемое заголовком ,
объяснять:
Если p[i] < 9, то (p[i] + 1)%10 больше 0, и цикл заканчивается напрямую (без переноса),
Если p[i] == 9, p[i] + 1 = 10 % 10 == 0; тогда p[i] будет равно 0, оцените вниз и продолжайте цикл (i --) до тех пор, пока цикл не закончится или не прервется. Вырваться из петли.
( Если это такая ситуация, как 99, она будет идти до позиции p[0], (p[0]+1)%10==1; это дополнительный бит, который занимает перенос (p[0 ] ] Не забудьте поставить 0 здесь) )
три.
1. Теперь рассмотрим ситуацию, когда перенос не занимает позицию p[0] (когда p[0] все еще равен 0)
2. Изменилось количество возвратов (как показано на диаграмме кода ниже)
3. Переместить массив p вперед на единицу
4. Для страховки поставьте '\0' в лишнюю цифру в конце p (это не повлияет на ваш опыт, если вы не упустите ее)
код
int* plusOne(int* digits, int digitsSize, int* returnSize)
{
int* p = (int*)malloc(sizeof(int)*(digitsSize + 1));
int i = 0;
*returnSize = digitsSize + 1;
for(i = digitsSize - 1; i >= 0; i--)
{
p[i + 1] = digits[i];//新数组把原数组整体都向后挪一位,p[0]==0;因为有99这样的可能,变100;
}
p[0] = 0;
for(i = digitsSize; i >= 0; i--)
{
p[i] = (p[i] + 1)%10;//如果是类似99这样的情况,那就会一直走到p[0]那位,
//(p[0]+1)%10==1;
if(p[i] == 0)
{
continue;
}
else
{
break;
}
}
if(p[0] == 0)
{
*returnSize = digitsSize;
for(i = 0; i < digitsSize; i++)
{
p[i] = p[i+1];//没进位时,就把数组挪回来,把p[0]占了,不空0了
}
p[i] = '\0';
}
return p;
free(p);
p = NULL;
}
67. Двоичная сумма
Имея две двоичные строки a и b, верните их сумму в виде двоичной строки.
Пример 1:
Ввод: a = "11", b = "1"
Вывод: "100"
Пример 2:Ввод: а = "1010", б = "1011"
Выход: "10101"
Источник: LeetCode
Ссылка: https://leetcode.cn/problems/add-binary
ход мыслей
Те, кто понимает вышеизложенное, могут в принципе понять, в коде есть комментарии, если вы не понимаете, вы можете спросить в области комментариев или личном сообщении, я отвечу
код
char* addBinary(char* a, char* b)
{
int len1 = strlen(a);
int len2 = strlen(b);
int L = (len1 > len2) ? len1 : len2;
int max = L + 2;//包括了进位和'\0'
int ai = len1 - 1;//都从末位开始
int bi = len2 - 1;
int k = max - 2;//新数组有多进位(比原来的多一位时)时的下标(最后面的数的下标)
char* p = (char*)malloc(sizeof(char) * max);//给新数组创位置
p[max - 1] = '\0';//末位赋'\0'
p[0] = '0';
int flag = 0;//控制进位
while (ai >= 0 || bi >= 0)
{
//转成整型计算
int num1 = (ai >= 0) ? (a[ai] - '0') : 0;
int num2 = (bi >= 0) ? (b[bi] - '0') : 0;
int sum = num1 + num2 + flag;
p[k] = sum % 2 + '0';//形成新数组了
flag = sum / 2;//二进制得2进1
ai--;
bi--;
k--;
}
if (flag != 0)//此时就还得进位
{
p[k] = '1';
}
if (p[0] == '1')
{
return p;//p[0]是1,就表明进位了,把p空间占满了,从头返回就行
}
else//否则就从p下标1位开始返回(因为没进位,p[0]空的,不要)
{
return p + 1;
}
free(p);
p = NULL;
}
╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯Конец ╰(*° ▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯