1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | /* CSDN上说是迅雷招人的题。 字符串长度为N,生成N个字符的全排列,就是生成1个字符加上N-1个字符的全排列。 */ #include <stdio.h> #include <string.h> #include <stdlib.h> void myswap(char *p, int i, int j) { char c = p[i]; p[i] = p[j]; p[j] = c; } void generate(char *p, int start, int len) { if(start==len) { printf("%s\n", p); return ; } int i = 0; for(i=0; i<len-start; i++) { myswap(p, start, i+start); generate(p, start+1, len); myswap(p, start, i+start); } } void myswap1(char *p, char *q) { char c = *p; *p = *q; *q = c; } void generate1(char *str, char *p ,int len) { if(len == 0) { printf("%s\n", str); return; } int i=0; for(i=0; i<len; i++) { myswap1(p, p+i); generate1(str, p+1, len-1); myswap1(p, p+i); } } void foo(const char *str) { int len = strlen(str); char *p = (char *) malloc (len+1); if(p==NULL) exit(1); memcpy(p, str, len+1); generate(p, 0, len); //generate1(p, p, len);//这个好像更好一些 free(p); } int main() { char *str = "abcde"; foo(str); return 0; } |
August 27, 2010

你如果这样定义:char *str = “abcde”;程序在VC上运行会出现运行期错误,因为指针指向字符串常量,是不能够交换的,在GCC下我不知道可不可以.只能这样定义:char str[]=”abcde”;
哦,看第61~63行,我把内容copy出来了
呵呵。。。你copy出来就可以,呵呵
嗯,因为函数原型是void foo(const char *str),就是不让改str指向的内容,所以就copy出来了。
删除数组中重复的数,你有没有什么好的算法啊 O(n)的?
如果是排好序的,直接O(N)了。
如果没有排好序,hash应该是最快的了吧。
hash表的大小怎么确定啊?呵呵,难道先要找到数组中的最大值?
表大小估计一下。写了个链接法的hashtable,发给你了。
hash表占空间,所以我认为也不好,你想想,我真的想不出来了,呵呵