x*****m 发帖数: 29 | 1 p.s. 看来之前那个题目说错话了, 就是觉得这个框架挺容易理解记忆的,既不是最优也不是最简单也不是最**最&&的,大
家轻拍..轻拍...
刚刚研究出来的~ 觉得还挺直观挺好记忆的~
Combination(s, start, k) : 从串s的位置start开始选k个元素
从位置1开始,分成选位置1和不选位置1的
然后递归调用,位置2,继续分成选位置2和不选位置2的...依次类推
如果剩下的和k相等,或者k==0了,就选择完毕了可以输出一个combination了
my code:
void Combination(std::string s, int start, int k) {
std::string temp;
int remaining = s.size() - start;
if (remaining == k) {
std::cout << s << std::endl;
return;
}
if (k == 0) {
std::cout << s.erase(start, | m******9 发帖数: 968 | 2 呵呵,你又开了一帖研究出来啦。 不过你帖子的题目实在太霸气了点把。
我帮你指出一下小问题吧。
第一个就是function signature的问题, 我觉得你应该用指针,而不是string,很多
时候面试官会给出限定的。
还有你依赖了 string::erase(), 这个最好不用。 你这个不是最优化的,至少你要在
你的s中删除字符。
如果你觉得 你这个方法很好的话, 可以再琢磨一下另外一个经典的题目,就是
combination打印手机按键的那个题目。 | m******9 发帖数: 968 | 3 我再贴个另外的写法吧,思路还是沿用你自己的思路,就是每个index 分成选择,或者
不选择。 你可以加上一个辅助数组,用来标记那些index被选择了,哪些没有被选择。
void combination(char* s, int start, bool* c, int n)
{
if(s[start]=='\0'){
print_combination(s, c, n);
return;
}
c[start] = true;
combination(s, start+1,c,n);
c[start] = false;
combination(s, start+1, c,n);
}
void print_combination(char* s, bool* c, int n)
{
for(int i=0; i
if(c[i]==true)
cout<
}
cout<
} | g*****u 发帖数: 298 | 4 最简单的?莫过于64个元素以内(用long long表示,),从0 loop到 2^64-1, 输出每个
integer的set bits. | x*****m 发帖数: 29 | 5 题目阿..没有霸气的意思..就是觉得这样更好记忆 效率么确实不是最优的
你的改进方法很不错阿~~ 我再去研究下别的题目去~~
【在 m******9 的大作中提到】 : 呵呵,你又开了一帖研究出来啦。 不过你帖子的题目实在太霸气了点把。 : 我帮你指出一下小问题吧。 : 第一个就是function signature的问题, 我觉得你应该用指针,而不是string,很多 : 时候面试官会给出限定的。 : 还有你依赖了 string::erase(), 这个最好不用。 你这个不是最优化的,至少你要在 : 你的s中删除字符。 : 如果你觉得 你这个方法很好的话, 可以再琢磨一下另外一个经典的题目,就是 : combination打印手机按键的那个题目。
| m******9 发帖数: 968 | 6 哈哈,居然把题目改了,我觉得你原来那个题目很可爱呀 | x*****m 发帖数: 29 | 7 哈 之前就想突出一下这个好记么..结果不小心多打了个最...
【在 m******9 的大作中提到】 : 哈哈,居然把题目改了,我觉得你原来那个题目很可爱呀
|
|