LeetCode 476. Number Complement(easy難度c++)

來源:互聯網
上載者:User

標籤:number   osi   難度   知識   操作   solution   inpu   lan   example   

題目: 

Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

Note:

  1. The given integer is guaranteed to fit within the range of a 32-bit signed integer.
  2. You could assume no leading zero bit in the integer’s binary representation.

 

Example 1:

Input: 5Output: 2Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.

 

Example 2:

Input: 1Output: 0Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.

思路: 
題目其實不難,但是找到高效的解法其實並不容易,從我測試的結果來看,題目中的測試案例使用的應該都是正數。具體來說可以這樣做:1、先確定轉化為二進位之後的數字位元,比如5對應101,就是三位元;2.再取對應的數量的1,此時取111,二者異或運算,得到010,也就是2,就是所求的數字。

代碼如下:

 1 class Solution { 2 public: 3     int findComplement(int num) { 4          5          int mask = 1, temp = num; 6         while(temp > 0) { 7               mask = mask << 1; 8              temp = temp >> 1; 9          }10          return num^(mask-1);11     }12 };

 

首先來補充一點背景知識。 1、在電腦系統中,數值一律使用補碼來表示和儲存。主要原因是使用補碼可以將符號位和其它位統一處理;同時,減法也可按照加法來處理。另 外,   兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。- 補碼與原碼的轉換過程幾乎相同。    - 數值的補碼錶示(分兩種)        - 正數的補碼:與原碼相同        - 負數的補碼:符號位位1,其餘位位該數絕對值的原碼按位取反;然後整個數加1    - 已知一個數的補碼,求原碼的操作分為兩種情況        - 如果補碼的符號位“0”,表示是一個正數,所以補碼就是該數的原碼        - 如果補碼的符號位為“1”,表示是一個負數,求原碼的操作可以是:符號位位1,其餘各位取反,然後整個數加1。2、移位元運算符就是在二進位的基礎上對數字進行平移。Java按照平移的方向和填充數位規則分為三種:<<左移,>>帶符號右移 和>>>無符號右移。3、 在Java的移位元運算中,byte、short和char類型移位後的結果會變成int類型,對於byte、short、char和int進行移位時,對於char、short、char和int進行移位操作時,規定實際移動的次數是移動次數和32的餘數,也就是移位33次和移位1次得到的結果相同。移動long型的數值時,規定實際移動的次數是移動次數和64的餘數,也就是移動65次移位1次得到相同的結果。    (1) <<  運算規則:按二進位形式吧所有的數字向左移動對應的位元,高位移出(捨棄),低位的空位補零。    文法格式:         需要移位的數字<<移位的次數         例如:4<<2 ,則是將數字4左移2位     計算過程         4<<2        Java中一個int數佔四個位元組,那麼4的位元字為00000000 00000000 00000000 00000100,然後把該數字左移兩位。其它的數字都朝右平移兩位,最後在低位(右側)的兩個空位補零。則得到的最終結果是00000000 00000000 00000000 00010000,即轉換為十進位數16。         在數字沒有溢出的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方。         在溢出的前提前,則不符合這個規律。讀者可以嘗試輸出(long)1610612736*4和1610612736<<2這兩個結果進行比對。    (2)>>運算規則:按二進位形式吧所有的數字都向右移動對應的位置,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1。     文法格式:         需要移位的數字>>移位的次數         例如:-4>>2和4>>2,則是將數字 -4和4右移2位     計算過程         4>>2         Java中一個int數佔四個位元組,同樣4的二進位為00000000 00000000 00000000 00000100,然後把該數字右移兩位。其它的數字都朝左平移兩位,最後在高位補符號位(該數是正數,全補零),得到的結果是00000000 00000000 00000000 00000001,即使十進位的1。數學意義就是右移移位相當於除2,右移n位相當於除以2的n次方。        4>>2         由於負數在電腦中是以補碼的形式儲存的,那麼-4的二進位為11111111 11111111 11111111 11111100,然後把該數字右移兩位,其它數字都朝左平移兩位,最後在高位補符號位(該數是負數,全補一),得到的結果是11111111 11111111 11111111 11111111(補碼格式),即是十進位的-1。    (3)>>>運算規則:按二進位形式吧所有的數字向右移動對應的位元,低位移出(捨棄),高位的空位補零。正數運算結果與帶符號右移相同,對於負數來說則不同。         對於4>>>2和-4>>>2運算,可以通過上述例子進行類推。

LeetCode 476. Number Complement(easy難度c++)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.