前段时间加班,让我好久没有看书了,周日又开始看programming pearls了,分享下我的代码。livewrier对代码排版的支持实在不好,大家凑合着看吧。
2.3节对字符串偏移的计算算法实在高明,真不知道作者是怎么想出来的,不过它的方法是可以用数学归纳法证明正确的,下面是我的实现代码:
#include
#include
void reverse(char *str, int startPos, int endPos)
{
char temp;
int i, j;
for (i=startPos, j=endPos; i
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
void main()
{
char sTest[] = "abcdefgh";
int rotate = 3;
int iLen = strlen(sTest);
printf("%s/n", sTest);
reverse(sTest, 0, rotate-1);
reverse(sTest, rotate, iLen-1);
reverse(sTest, 0, iLen-1);
printf("%s/n", sTest);
}
是什么问题还是看原书2.3节吧。
对于2.4节的问题我还没有看答案,自己先给出了解答。代码如下,下周我再看看书中的解答。
#include
#include
void swap(char *str, int from, int to)
{
char temp;
temp = str[from];
str[from] = str[to];
str[to] = temp;
}
//permuations: 找出字符串的所有组合排列但不重复
//startPos: 前startPos个字符串都已经固定了
void permutations(char *str, int startPos, const int iLen)
{
int i;
//如果固定长度等于字符串长度则打印字符串
if(iLen == startPos){
printf("%s/n", str);
}
//否则继续固定一个字符串
else{
for (i=startPos; i
swap(str, startPos, i);
permutations(str, startPos+1, iLen);
swap(str, startPos, i);
}
}
}
void main()
{
char sTest[] = "abcd";
int iLen = strlen(sTest);
permutations(sTest, 0, iLen);
}