2018.11.29——第四天

序言

提前说好晚上时间不够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。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值