题目:Missing Number
给定一个从0,1,2,...,n中取出的n个不同数字的数组,找到数组中缺少的数字。
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n
, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3]
return 2
.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
要求:线性时间复杂度O(n)和常数空间复杂度O(1)。
思路:
[0,n]的和很好求,用等差数列的求和公式,就能求出
sumn = max*(max + 1) / 2;
然后求出数组实际的和,相减就能求出缺失的数字。
int LeetCode::missingNumber(vector<int>& nums){ int sum = 0,sumn = 0;//sum是数组的和,sumn是[0,n]的和 int max = nums.size();//数组的最大值 for (auto i : nums)sum += i;//求和 sumn = max*(max + 1) / 2; return sumn - sum; }
题目:Add Digits
Given a non-negative integer num
, repeatedly add all its digits until the result has only one digit.
For example:
Given num = 38
, the process is like: 3 + 8 = 11
, 1 + 1 = 2
. Since 2
has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
给定非负整数num,将其所有位数的数字重复相加,直到结果只有一位数字。
要求:不用循环和递归,时间复杂度O(1)
思路:
通常思路按照求和的方式,相加知道符合要求,但是,这样必须使用循环或递归。
int LeetCode::addDigits(int num){ if (num < 0)return -1; /*循环求解*/ while (num >= 10){//是否小于10 int add = 0; while (num){//按位求和 add += num % 10; num /= 10; } num = add; } return num; }
思路:
如何不用循环和递归求解呢?
不妨设num = 100*a + 10*b + c,那么一次求和是a+b+c;
num = 99*a + a + 9*b + b + c = (99*a + 9*b) + (a+ b +c);只要去掉前面括号的部分就可以了。
即有 num%9;实际上,任何数字的按位和都可以这样,它最终求的结果是个位数,因此可以直接求出结果。
int LeetCode::addDigits(int num){ if (num < 0)return -1; //若num = 100a+10b+c,则(100a+10b+c)%9=(a+99a+b+9b+c)%9=(a+b+c)%9 if (!num)return 0; if (num % 9)return num % 9; return 9; }