1. 程式人生 > >LeetCode258 各位相加

LeetCode258 各位相加

題目

給定一個非負整數 num,反覆將各個位上的數字相加,直到結果為一位數。

示例

輸入: 38 輸出: 2 解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由於 2 是一位數,所以返回 2。

進階: 你可以不使用迴圈或者遞迴,且在 O(1) 時間複雜度內解決這個問題嗎?

C++程式碼

普通方法:

class Solution {
public:
	int addDigits(int num) 
	{
		if(num<=0) return num;
		vector<int> nums;
		do
		{
			getnums(nums, num);
			num = getsum(nums);
		}while(nums.size()-1)
		return num;
	}
	void getnums(vector<int> &num,int n)
	{
		num.clear();
		while(n)
		{
			num.push_back(n%10);
			n/=10;
		}
	}
	int getsum(vector<int> &num)
	{
		int sum=0;
		for(vector<int>::iterator iter=num.begin();iter!=num.end();iter++)
		{
			sum+=*iter;
		} 
		return sum;
	}
};
    

不使用迴圈或者遞迴,且在 O(1) 時間複雜度內的方法。。。 (n - 1) % 9 + 1 但是我沒弄明白。。。找規律是這樣的,但是吧,讓我自己想我肯定想不出來有這個規律。。。