前段時間加班,讓我好久沒有看書了,周日又開始看programming pearls了,分享下My Code。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);
}