(литкод) 66. Добавить единицу 67. Двоичное суммирование (подробное объяснение)

Оглавление

66. Плюс один 

ход мыслей

код

67. Двоичная сумма 

ход мыслей

код


 

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;
}

 

 

╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯Конец ╰(*° ▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯

Supongo que te gusta

Origin blog.csdn.net/iiiiiihuang/article/details/130513395
Recomendado
Clasificación