1006. Clumsy Factorial

LeetCode original: C# #array #backtracking #csharp #leetcode
選択した UI 言語に合わせて問題文をロシア語から翻訳します。コードは変更しません。

: medium

Факториал целого положительного числа n - это произведение всех целых положительных чисел, меньших или равных n. На例, факториал(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1.

Мы составляем неуклюжий факториал, используя целые числа в порядке убывания, заменяя операции умножения на фиксированную последовательность операций с умножением "*", делением "/", сложением "+" и вычитанием "-" в этом порядке. На例, clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1. Однако эти операции по-прежнему применяются с использованием обычного порядка операций арифметики. Мы выполняем все шаги умножения и деления перед шагами сложения и вычитания, а шаги умножения и деления выполняются слева направо. Кроме того, деление, которое мы используем, является делением с полом, так что 10 * 9 / 8 = 90 / 8 = 11. given 整数 n, return неуклюжий факториал n.

例:

Input: nums = [4,2,3], k = 1

Output: 5

C# 解法

照合済み/オリジナル
public class Solution {
    public int Clumsy(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2 * 1;
        if (n == 3) return 3 * 2 / 1;
        
        int res = n * (n - 1) / (n - 2);
        n -= 3;
        if (n > 0) res += n--;
        
        while (n > 0) {
            res -= n * (n - 1) / (n - 2);
            n -= 3;
            if (n > 0) res += n--;
        }
        
        return res;
    }
}

C++ 解法

自動ドラフト、提出前に確認
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int Clumsy(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2 * 1;
        if (n == 3) return 3 * 2 / 1;
        
        int res = n * (n - 1) / (n - 2);
        n -= 3;
        if (n > 0) res += n--;
        
        while (n > 0) {
            res -= n * (n - 1) / (n - 2);
            n -= 3;
            if (n > 0) res += n--;
        }
        
        return res;
    }
}

Java 解法

照合済み/オリジナル
public class Solution {
    public int clumsy(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2 * 1;
        if (n == 3) return 3 * 2 / 1;
        
        int res = n * (n - 1) / (n - 2);
        n -= 3;
        if (n > 0) res += n--;
        
        while (n > 0) {
            res -= n * (n - 1) / (n - 2);
            n -= 3;
            if (n > 0) res += n--;
        }
        
        return res;
    }
}

JavaScript 解法

照合済み/オリジナル
class Solution {
    clumsy(n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2 * 1;
        if (n == 3) return 3 * 2 / 1;
        
        let res = n * (n - 1) / (n - 2);
        n -= 3;
        if (n > 0) res += n--;
        
        while (n > 0) {
            res -= n * (n - 1) / (n - 2);
            n -= 3;
            if (n > 0) res += n--;
        }
        
        return res;
    }
}

Python 解法

照合済み/オリジナル
class Solution:
    def clumsy(self, n: int) -> int:
        if n == 0:
            return 0
        if n == 1:
            return 1
        if n == 2:
            return 2 * 1
        if n == 3:
            return 3 * 2 // 1
        
        res = n * (n - 1) // (n - 2)
        n -= 3
        if n > 0:
            res += n
        n -= 1
        
        while n > 0:
            res -= n * (n - 1) // (n - 2)
            n -= 3
            if n > 0:
                res += n
            n -= 1
            
        return res

Algorithm

Инициализация переменных и обработка первых трех чисел:

Создайте переменные для хранения результата и текущего значения.

Если n меньше или равен 3, обработайте случай отдельно, выполняя операции в порядке убывания, и return результат.

Выполнение операций в цикле:

Создайте цикл, который будет обрабатывать числа от n до 1 в порядке убывания.

В цикле выполняйте операции *, /, +, и - последовательно.

Обновляйте текущий результат на каждом шаге в зависимости от остатка от деления текущего индекса на 4.

Учет оставшихся операций и возврат результата:

После завершения цикла добавьте или вычтите оставшиеся числа (если есть) к результату.

return окончательный результат.

😎

Vacancies for this task

有効な求人 with overlapping task tags are 表示.

すべての求人
有効な求人はまだありません。