Given a non-negative integer num
, return the number of steps to reduce it to zero. If the current number is even, you have to divide it by 2, otherwise, you have to subtract 1 from it.
Example 1:
Input: num = 14 Output: 6 Explanation: Step 1) 14 is even; divide by 2 and obtain 7. Step 2) 7 is odd; subtract 1 and obtain 6. Step 3) 6 is even; divide by 2 and obtain 3. Step 4) 3 is odd; subtract 1 and obtain 2. Step 5) 2 is even; divide by 2 and obtain 1. Step 6) 1 is odd; subtract 1 and obtain 0.
Example 2:
Input: num = 8 Output: 4 Explanation: Step 1) 8 is even; divide by 2 and obtain 4. Step 2) 4 is even; divide by 2 and obtain 2. Step 3) 2 is even; divide by 2 and obtain 1. Step 4) 1 is odd; subtract 1 and obtain 0.
Example 3:
Input: num = 123 Output: 12
Constraints:
0 <= num <= 10^6
題目大意:給定一個非負整數num,返回將其變為0的步數。如果當前的數是偶數,將其除2,否則將其減去1.
思路:直接模擬,為了提高效率,除2用位運算。
C++代碼1:
1 class Solution { 2 public: 3 int numberOfSteps (int num) { 4 int cnt = 0; 5 while (num != 0) { 6 if (num & 1) //為奇數 7 num--; 8 else 9 num >>= 1; 10 cnt++; 11 } 12 return cnt; 13 } 14 };
C++代碼二:
一般條件下,如果一個數是奇數,我們將其減去1后,下一步肯定除2,(如(5 - 1)/2=2,用了兩步),而利用位運算,可以直接右移一位,會產生兩步的效果:5 >> 1 = 2.
只要整數num一直減小,在變成0之前,肯定會變成1. 當數為1時,步數會多算1.
class Solution { public: int numberOfSteps (int num) { int cnt = 0; while (num != 0) { cnt += (num & 1) ? 2 : 1; num >>= 1; } return cnt - 1; } };
python3代碼:
1 class Solution: 2 def numberOfSteps (self, num: int) -> int: 3 cnt = 0 4 while num != 0: 5 num, cnt = num - 1 if num % 2 else num // 2, cnt + 1 6 return cnt