今天写的两个道题目都是数学模块的,感觉就是“很难很繁琐”,看似比较简单,却很难调试正确
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;
}
};