1. 程式人生 > >對一個整數按位反轉和對字元反轉

對一個整數按位反轉和對字元反轉



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 

相關推薦

一個整數反轉字元反轉

 unsignedint ReverseBitsInWord(unsignedint Num) { unsignedint ret = 0; int i;    unsigned

2.6一個整數中的各個數字求和.py

output main IT ted sum code input 一個 it is # -*- coding: utf-8 -*- """ Created on Sun Apr 22 16:27:35 2018 @author: MyPC """ def main(

計算1個數--計算一個整數二進位制中1的個數。要求效率儘可能的高。且能正確求正數負數的二進位制中1的個數。

錯誤方法: 數字右移,這裡會涉及到移位的規則。 移位規則: 左移運算子m<<表示把m左移n位。左移n位的時候,最左邊的n位將被丟棄,同時在右邊補上n個0; 右移比左移稍微複雜一些,如果數字是一個無符號值或正數,右移時最左邊補0; 如果數字是

輸入一個十進位制整數,設計遞迴函式,將該整數轉化為一個二進位制數。 思考: 如何將一個十進位制數轉化成一個8進16進制數。

1,輸入一個十進位制整數,設計遞迴函式,將該整數轉化為一個二進位制數。思考: 如何將一個十進位制數轉化成一個8進位制和16進位制數。 #include<stdio.h> #define  N  20 int main() { int a,n,c,k,i; cha

js 象的創建方式象的區別

怎樣 mman ons indexof pad new tar container 但是 js一個有三種方法創建對象,這裏做一個總結. 1.對象直接量 所謂對象直接量,可以看做是一副映射表,這個方法也是最直接的一個方法,個人比較建議, 1 2 3 4 5 6

C語言指標——普通變數的指標操作陣列(常量)的指標操作

       我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。        我們喜歡在程式中使用指標代替陣列,因為變數指標可

劍指offer——不用加減乘除做加法(異或)

class Solution { public: int Add(int num1, int num2) { while(num2 != 0){//若需要進位 int sum = num1 ^ num2;//異或,01=1,00=0,11=

ContentProvider提供的資料庫批量操作的方法資料庫變化監控的方法

最近專案中用到了資料批量入庫和監控資料庫變化的需求,整理總結如下: 1.批量操作資料庫的方法 1)ContentProvider中提供了批量處理資料的方法applyBatch,Android原始碼在ContentProvider.java中實現如下: @Override

基礎篇-verilog-邏輯與

//邏輯與 wire [3:0] a=4’b0101; wire [3:0] b=4’b1110; c=a && b; //c=1 邏輯與&&表示的是交集,2個條件同時成立,結果才為真 wire [3:0] a=4’b0101; wire [3:0] b=4’b0000; c=

將圖片檔案轉化為位元組陣列字串,並其進行Base64編碼處理 位元組陣列字串進行Base64解碼並生成圖片

public static String imageToBase64(String path) { // 將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理 byte[] data = null; // 讀取圖片位元組

一個整數大小順序插入已排好序的陣列中。

為了把一個數按大小插入已排好序的陣列中,應首先確定排序是從大到小還是從小到大進行的。設排序是從大到小進序的,則可把欲插入的數與陣列中各數逐個比較,當找到第一個比插入數小的元素 i 時,該元素之前即為插入位置。然後從陣列最後一個元素開始到該元素為止,逐個後移一個單元。最後把插

關於或以及左/右移的相關知識

1、按位與(&)與普通的與(&&)的一些不同之處: (1)按位與(&)是每個相應的位元位都進行與操作,在比較時依然遵循0&&1=0&&01&&0=0,1&&1=1原則。而與(&a

.NET Core 龍芯的支援情況 .NET Core 開發嵌入式的思考

目錄 .NET Core 對龍芯的支援情況和對 .NET Core 開發嵌入式的思考 一,遺憾的嘗試 二,.NET Core在嵌入式下的幾點不足 三,.NET Core 龍芯移植的進展和資料

給定一個字串一個整數k,字串開頭算起的每2k個字元的前k個字元進行反轉。 如果還有少於k個字元,則將其全部撤消。 如果小於2k但大於或等於k個字元,則反轉前k個字元

本題源自leetcode  541 ------------------------------------------------------------- 思路:遍歷字串,跳度為 2 * k.每次反轉前k 個字串。 程式碼: string reverseStr(stri

一個字元bit逆序(又稱反轉

題目要求如題所示:將一個字元按bit位逆序,例如一個位元組是0x11,將其逆序後就變成0x88。下面是四種解法,其中最後一種效率最高,是從《Hacker's Delight》這本書中學來的。第一種:看似創新,其實最笨的做法。使用bit型別,程式碼不夠簡潔,執行效率較低,並且擴

k進制正整數k-1取余與取余

散列函數 輸入 frame 整除 data- display order view ren 華電北風吹 天津大學認知計算與應用重點實驗室 日期:2015/8/24 先說一下結論 有kk進制數abcdabcd,有abcd%(k?1)=(a+b+c+

每天一個JS 小demo之韓雪冬輪播圖。主要知識點:html,css布局,對於數組象的理解運用

身高 全局 borde ava ebo 空間 use mouseout desc 1 @charset "utf-8"; 2 /* CSS Document */ 3 4 * { padding: 0; margin: 0; } 5 li { list-st

獲取一個臨時文件中文文件名字進行編碼的工具類

臨時工 進行 fff ima odi fileutil sta 先生 java      首先我們明白,一個文件可以命名為任何名稱,比如一個excel,我們可以命名為不帶後綴,然後向裏面寫入對應的內容,只是在導出的時候將文件命名為正確的名字即可。   一個在當前用

獲取一個臨時檔案中文檔名字進行編碼的工具類

     首先我們明白,一個檔案可以命名為任何名稱,比如一個excel,我們可以命名為不帶字尾,然後向裡面寫入對應的內容,只是在匯出的時候將檔案命名為正確的名字即可。     一個在當前使用者的預設臨時資料夾中生成一個當前日期的資料夾,然後再裡面寫入一個用UUID生成名字的檔案,常用於Java