题目
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321。
一开始解法,转成数字类型,计算后再重新组合成数组(但是数字过大就会异常不符合LeetCode要求,也贴出来吧,看看即可,领悟到实际开发需要写代码前必须考虑全面)
/// <summary> /// 只兼容最大int64 /// </summary> /// <param name="digits"></param> /// <returns></returns> public static int[] PlusOne2(int[] digits) { if (digits != null && digits.Length > 0) { if (digits[0] == 0) { return digits; } if (digits[digits.Length - 1] < 9) { digits[digits.Length - 1] += 1; } else { string num = ""; for (int i = 0; i < digits.Length; i++) { num += Convert.ToString(digits[i]); } num = Convert.ToString((Convert.ToInt64(num) + 1)); digits = new int[num.Length]; int j = 0; foreach (var c in num) { digits[j] = Convert.ToInt32(c.ToString()); j++; } } } return digits; }
以下是符合LeetCode的规范解法
public static int[] PlusOne(int[] digits) { if (digits != null && digits.Length > 0) { if (digits[digits.Length - 1] < 9) { digits[digits.Length - 1] += 1; } else { //尾号小于9不用进位, if (digits[digits.Length - 1] < 9) { digits[digits.Length - 1] += 1; } else { //全是9,数组长度加1 if (digits.Where(x => x == 9).Count() == digits.Length) { digits = new int[digits.Length + 1]; digits[0] = 1; for (int i = 1; i < digits.Length; i++) { digits[i] = 0; } } else { for (int j = digits.Length - 1; j >= 0; j--) { if (digits[j] == 9) { digits[j] = 0; } else { digits[j] += 1; return digits; } } } } } } return digits; }