10.30(60. 第k个排列-----66. 加一)

今天写的两个道题目都是数学模块的,感觉就是“很难很繁琐”,看似比较简单,却很难调试正确

60. 第k个排列(通过)

思路:

效率:98.78%

程序代码:

class Solution {
public:
	string getPermutation(int n, int k) {
		if (n == 1) return "1";
		string s;//存储最终结果
		vector<int> vec;
		int t=1;//表示商
		for (int i = 0; i < n; i++)
			vec.push_back(i + 1);//全部赋值
		while (k != 0&&k != 1) {
			int len = vec.size() - 1;
			int divisor = fac(len);
			t = ceil(float(k)/divisor)-1;//这里是向上取整
			k = t!=0?k-(divisor*t):k;
			s += to_string(vec[t]);//转变成字符串
			vec.erase(vec.begin()+t);//删除掉这一个
		}
		for (auto e:vec) {
			s += to_string(e);
		}
		return s;
	}
	int fac(int n) {
		if (n == 0) return 1;
		return fac(n - 1)*n;
	}
};

参考优秀答案:

class Solution {
public:
	int jie_cheng(int n)
	{
		int r=1;
		while (n)r *= n--;
		return r;
		
	}
	string getPermutation(int n, int k) 
	{
		vector<int> v;
		string s;
		for (int i = 1; i <= n; ++i)v.push_back(i);
		int temp;
		for (int i = 0; i < n; ++ i)
		{
			temp = (k - 1) / jie_cheng(n - i - 1);
			s += v[temp] + '0';
			k = k - temp*jie_cheng(n - i - 1);
			v.erase(v.begin() + temp);
		}
		return s;
	}
};

发现我们的思路是一样一样的,阶乘函数需要自己写

66. 加一(通过)

思路:从后向前推进,使用向量的前插入想法

效率:63.28%

程序代码:

class Solution {
public:
	vector<int> plusOne(vector<int>& digits) {
		vector<int> result;//这个表示最终结果
		int a = 1,b=0;
		int n = digits.size() - 1;
		for (int i = n; i >= 0; i--) {
			b = (a + digits[i]) % 10;//b是放在当前位置的
			a = (a + digits[i]) / 10;
			digits[i] = b;//我们选择在原位修改和插入
			
		}
		if (a)
			digits.insert(digits.begin(),a);
		return digits;
	}
};

猜你喜欢

转载自blog.csdn.net/the_little_fairy___/article/details/84394295
今日推荐