序言
提前说好晚上时间不够java再实现一遍了,实验凶残呐!!!
直接上题目
题目
最简单的,用循环把所有组成都排列起来,再存放在数组里,然后需求多大的直接输出对应下标即可。但是事实上,用这个方法所占空间实在太大了,而且没啥意思。故而考虑从规律方法入手:按照阶乘的性质,层层划分,按照(n-1)!给序列分块(1xxxx,2xxxx,3xxxx),然后确定在一块中,输出打头的数字,同理求下一个打头的数字,将问分治解决。
第一次实现
class Solution {
public:
string getPermutation(int n, int k) {
vector <int> v;//继续熟悉vector
string result;
int a=0,b=k;
int m=n;//将n传递m,m将在每次分解中变小
for(int i=1;i<=n;i++)
v.push_back(i);
int block=1;//分“块”解决 初始为n!
for(int i=1;i<=n;i++)
block*=i;
while(m!=0){
block/=m;//block缩小
a=b/block;
b=b%block;
result+=to_string(v[a-(b==0)]);
v.erase(v.begin()+a-(b==0));
m--;
if(b==0&&m!=0){
for(int i=m-1;i>=0;i--){
result+=to_string(v[i]);// 现学现用
v.erase(v.begin()+i);
m--;
}
}
}
return result;
}
};
所学知识汇总
string基础知识
(https://blog.csdn.net/peng0614/article/details/79532966)
头文件:#include <string>
c++初始化string对象的方式有以下几种常见的方式。
/**定义和初始化string**/
string s1; //定义以空字符,使用类中默认初始化
string s2 = s1; //拷贝初始化,用s1赋值给s2
string s3 = "Hello";//拷贝初始化,用字符串字面值初始化s3
string s4(10, 'c'); //直接初始化,s4的内容是cccccccccc
string s5(s3); //直接初始化,这是新的初始化方式,等价于s5 = s3
string s6("World"); //直接初始化,这是新的初始化方式,等价于s6 = "World"
数值转string
std::string to_string(int value); (1) (C++11起)
std::string to_string(long value); (2) (C++11起)
std::string to_string(long long value); (3) (C++11起)
std::string to_string(unsigned value); (4) (C++11起)
std::string to_string(unsigned long value); (5) (C++11起)
std::string to_string(unsigned long long value); (6) (C++11起)
std::string to_string(float value); (7) (C++11起)
std::string to_string(double value); (8) (C++11起)
std::string to_string(long double value); (9) (C++11起)
std::to_string是C++标准(2011年)的最新版本中引入的功能。旧的编译器可能不支持它。
//字符指针和字符串的转换
"字符指针和字符串的转换:
//string转换为char*
cout << s1.c_str() <<endl; //s1.c_str()即为s1的char *形式
//char*获取string内容
char buf[64] = {0};
s1.copy(buf, 7);//复制7个元素
cout << buf <<endl;
}
//字符串连接
"方式1:
string s1 = "123";
string s2 = "456";
s1 += s2;
"方式2:"
string s3 = "123";
string s4 = "456";
s3.append(s4);
发现问题汇总
明明一大早就有了思路和方法,实现的时候却老是出错,我是不是要完了QAQ...
总结
挺简单一道题非要搞得这么累啊,是太马虎还是太蠢了。。。老是有各种错。。还需要在推演一遍才能过唉
继续欠着java。。。