對一個整數按位反轉和對字元反轉
unsignedint ReverseBitsInWord(unsignedint Num)
{
unsignedint ret = 0;
int i;
unsigned int shift = sizeof(Num)* 8;
for(i=0;i<shift;i++)
{
ret <<= 1;
ret |= Num & 1; //對整數的最後一位取反,返回結果左移一位
Num >>=1;//右移一位,則整數的最後一位消失,整數的下一位變成最後一位了
}
return ret;
}
通過每次取傳入引數的最後一位( Num & 1),然後與要返回的結果相 “ 或 ”,
把傳入引數 Num 右移 1 位,要返回的結果左移一位,來實現數字反轉的。
字串逆序可以說是最經常考的題目。這是一道入門級的題目,相信80%的程式設計師經歷過這道題。給定一個字串s,將s中的字元順序顛倒過來,比如s="abcd",逆序後變成s="dcba"。
普通逆序
直接分配一個與原字串等長的字元陣列,然後反向拷貝:
#include <stdio.h> #include <stdlib.h> static char * const reverse_string(char * const srcStr) { //buffer two pointers, one point to str start addr, the other point to str end addr char *EndPtr=srcStr; while (*EndPtr) EndPtr++; EndPtr--;//EndPtr指向字串 除'\0'之外的最後一個字元。 //分配空間,儲存逆序後的字串。 char *RevrtedStr= (char *)malloc(sizeof(char)*(EndPtr-srcStr)); char *returnStr=RevrtedStr; // 逆序儲存 while (srcStr<=EndPtr) { *RevrtedStr++=*EndPtr--; } *RevrtedStr='\0'; return returnStr; } int main(int argc,char **argv) { char *returnStr =reverse_string(argv[1]); printf ("Reverted String is : %s \n", returnStr); return 0; }
原地逆序
英文叫做in-place reverse。這是最常考的,原地逆序意味著不允額外分配空間,主要有以下幾種方法,思想都差不多,就是將字串兩邊的字元逐個交換,如下圖。給定字串"abcdef",逆序的過程分別是交換字元a和f,交換字元b和e,交換字元c和d。
設定兩個指標,分別指向字串的頭部和尾部,然後交換兩個指標所指的字元,並向中間移動指標直到交叉。
#include <stdio.h> static char * const reverse_string(char * const srcStr) { //buffer two pointers, one point to str start addr, the other point to str end addr char *StartPtr=srcStr; char *EndPtr=srcStr; while (*EndPtr) EndPtr++; EndPtr--; //swap and move start/end pointers unless start==end while (StartPtr<EndPtr) { char tmp=*StartPtr; *StartPtr = *EndPtr; *EndPtr=tmp; StartPtr++; EndPtr--; } return srcStr; } int main(int argc,char **argv) { char *inputStr=argv[1]; char *returnStr =reverse_string(inputStr); printf ("Reverted String is : %s \n", returnStr); return 0; }
用遞迴的方式,需要給定逆序的區間,呼叫方法:Reverse(s, 0, strlen(s)) ;
01 |
//
對字串s在區間left和right之間進行逆序,遞迴法 |
02 |
char *Reverse( char *s, int left, int right
) |
03 |
{ |
04 |
if (left
>= right) |
05 |
return s
; |
06 |
07 |
char t
= s[left] ; |
08 |
s[left]
= s[right] ; |
09 |
s[right]
= t ; |
10 |
11 |
Reverse(s,
left + 1, right - 1) ; |
12 |
} |
非遞迴法,同樣指定逆序區間,和方法一沒有本質區別,一個使用指標,一個使用下標。
01 |
//
對字串str在區間left和right之間進行逆序 |
02 |
char
|