vector<int> plusOne(vector<int>& digits)
时间: 2024-06-02 08:03:41 浏览: 14
函数plusOne(vector<int>& digits)的作用是将给定的整数数组digits表示的数字加一,并返回结果。
具体实现如下:
1. 首先,我们需要判断数组digits是否为空。如果为空,则直接返回一个只包含数字1的数组。
2. 如果数组digits不为空,则从数组的最后一个元素开始遍历。
3. 对于每个元素,我们将其加一,并判断是否需要进位。如果不需要进位,则直接返回结果。
4. 如果需要进位,则将当前元素置为0,并继续遍历前一个元素。
5. 如果遍历完所有元素后仍然需要进位,则在数组的最前面插入一个数字1。
6. 最后,返回结果数组。
以下是函数的具体实现代码:
```cpp
vector<int> plusOne(vector<int>& digits) {
int n = digits.size();
for (int i = n - 1; i >= 0; i--) {
if (digits[i] < 9) {
digits[i]++;
return digits;
}
digits[i] = 0;
}
digits.insert(digits.begin(), 1);
return digits;
}
```
相关问题
#include <iostream> #include <vector> #include <string> #include <unordered_map> using namespace std; vector<string> letterCombinations(string digits){ vector<string> res; if (digits.empty()) { return res; } unordered_map<char, string> mapping = { {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"} }; string combination; backtrack(res, combination, digits, 0, mapping); return res; } void backtrack(vector<string>& res, string& combination, string& digits, int index, unordered_map<char, string>& mapping) { if (index == digits.size()) { res.push_back(combination); return; } } int main() { string digits = "23"; vector<string> res = letterCombinations(digits); for (string s : res) { cout << s << " "; } cout << endl; return 0; }
这段代码是一个 C++ 实现的电话号码的字母组合问题。给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。具体地,每个数字可以表示多个字母,不同数字之间的字母组合排列方式要求按照数字的顺序进行。代码中使用了回溯算法来解决该问题。其中 `letterCombinations` 函数用来生成所有的字母组合,`backtrack` 函数用来进行回溯操作。在 `letterCombinations` 函数中,首先根据数字字符和字母的映射关系创建了一个 `unordered_map` 对象 `mapping`。然后定义了一个空字符串 `combination` 和一个空 vector `res` 来保存最终结果。最后调用了 `backtrack` 函数来生成所有的字母组合。在 `backtrack` 函数中,首先判断是否达到了数字字符串的末尾,如果是,则将当前的 `combination` 字符串保存到 `res` 中。否则,遍历当前数字字符所能表示的所有字母,依次加入到 `combination` 字符串中,然后递归调用 `backtrack` 函数,添加下一个数字字符所能表示的字母。递归完成后,需要将 `combination` 字符串还原到上一个状态,以便进行下一次回溯。最终返回 `res` 数组即可。
优化这段代码public class Program { public static void Main() { List<int> scores = new List<int> { 20, 20, 21, 22, 98, 39, 98, 98 }; string concatenated = string.Join("", scores.Select(s => s.ToString()).Distinct()); List<int> digits = concatenated.Select(c => int.Parse(c.ToString())).ToList(); digits.Sort(); digits.Reverse(); int maxValue = int.Parse(string.Join("", digits)); Console.WriteLine("最大值: " + maxValue); } }
你可以对代码进行如下优化:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
List<int> scores = new List<int> { 20, 20, 21, 22, 98, 39, 98, 98 };
int maxValue = GenerateMaxValue(scores);
Console.WriteLine("最大值: " + maxValue);
}
public static int GenerateMaxValue(List<int> scores)
{
List<int> digits = scores.Distinct()
.OrderByDescending(s => s)
.SelectMany(s => s.ToString())
.Select(c => int.Parse(c.ToString()))
.ToList();
return int.Parse(string.Join("", digits));
}
}
```
这段代码将生成最大值的逻辑封装在了一个新的方法 `GenerateMaxValue` 中。在这个方法中,首先使用 LINQ 操作符 `Distinct` 删除重复的数字,并使用 `OrderByDescending` 按降序对数字进行排序。然后,通过 `SelectMany` 将每个数字转换为字符数组,再使用 `Select` 将字符转换为整数,并将结果存储在 `digits` 列表中。最后,使用 `string.Join` 将数字连接起来,并通过 `int.Parse` 将其转换为整数返回。
这样做的好处是将代码分解成更小的可读性更高的部分,并且可以在需要生成最大值的其他地方重复使用 `GenerateMaxValue` 方法。