diff --git a/algorithms/001404-number-of-steps-to-reduce-a-number-in-binary-representation-to-one/README.md b/algorithms/001404-number-of-steps-to-reduce-a-number-in-binary-representation-to-one/README.md index 39f4ea687..d8937b077 100644 --- a/algorithms/001404-number-of-steps-to-reduce-a-number-in-binary-representation-to-one/README.md +++ b/algorithms/001404-number-of-steps-to-reduce-a-number-in-binary-representation-to-one/README.md @@ -1,6 +1,8 @@ 1404\. Number of Steps to Reduce a Number in Binary Representation to One -Medium +**Difficulty:** Medium + +**Topics:** `String`, `Bit Manipulation` Given the binary representation of an integer as a string `s`, return _the number of steps to reduce it to `1` under the following rules:_ @@ -39,3 +41,112 @@ It is guaranteed that you can always reach one for all test cases. - s consists of characters '0' or '1' - s[0] == '1' + +**Hint:** +1. Read the string from right to left, if the string ends in '0' then the number is even otherwise it is odd. +2. Simulate the steps described in the binary string. + + + +**Solution:** + +We are given a binary string `s` that represents a number. The goal is to reduce this number to `1` by performing the following operations: +- If the number is even, divide it by `2`. +- If the number is odd, add `1` to it. + +We need to determine how many steps it takes to achieve this. + +### Observations +1. A binary number is **even** if its last digit is `0` and **odd** if its last digit is `1`. +2. Dividing a binary number by `2` is equivalent to removing its last digit (`s = substr($s, 0, -1)`). +3. Adding `1` to a binary number can sometimes cause a carry that affects the preceding digits. + +### Approach +Simulate the process step by step: +1. Start from the least significant bit (rightmost character of the string). +2. Check if the number is odd or even: + - If odd: Add `1`. This might propagate a carry, modifying the preceding bits. + - If even: Divide by `2`, which removes the last digit. +3. Continue the simulation until the number is reduced to `1`. +4. Keep a counter to track the number of steps. + +Let's implement this solution in PHP: **[1404. Number of Steps to Reduce a Number in Binary Representation to One](https://github.com/mah-shamim/leet-code-in-php/tree/main/algorithms/001404-number-of-steps-to-reduce-a-number-in-binary-representation-to-one/solution.php)** + +```php + +``` + +### Explanation: + +1. **Variables**: + - `steps`: Keeps track of the total number of operations performed. + - `carry`: Tracks if there is a carry after adding `1` to a binary number. + +2. **Iteration**: + - Start from the rightmost bit and process each bit up to the second bit (skip the first bit for now). + - For each bit: + - If it’s `1`: Adding `1` makes it `0`, but it propagates a carry to the next bit. This requires two operations (add and divide). + - If it’s `0`: Division directly removes the bit. However, if there is a carry from the previous bit, the `0` effectively acts as a `1`, requiring extra operations. + +3. **Final Step**: + - After processing all bits except the first, check if there’s a carry for the most significant bit. If so, add one final step. + +### Complexity Analysis +1. **Time Complexity**: _**O(n)**_, where _**n**_ is the length of the binary string `s`. This is because we iterate through each bit once. +2. **Space Complexity**: _**O(1)**_, as we use only a few variables and do not allocate additional data structures. + +### Example Walkthrough + +#### Input: `"1101"` (Binary for 13) +1. Start processing from the rightmost bit: + - Bit 1: Odd → Add `1` → Becomes `1110`. Steps: `2`. + - Bit 0: Even → Divide by `2` → Becomes `111`. Steps: `3`. + - Bit 1: Odd → Add `1` → Becomes `1000`. Steps: `5`. + - Bit 0: Even → Divide by `2` → Becomes `100`. Steps: `6`. + - Bit 0: Even → Divide by `2` → Becomes `10`. Steps: `7`. + - Bit 0: Even → Divide by `2` → Becomes `1`. Steps: `8`. + +#### Final Steps: Total = `6`. + +### Edge Cases +1. **Input `"1"`**: + - Already `1`, no steps needed. Output: `0`. + +2. **Input `"10"`**: + - `"10"` → `"1"` in one step. Output: `1`. + +3. **Large Binary Strings**: + - The algorithm handles large inputs efficiently due to its linear time complexity. + +This solution is robust, optimized, and adheres to the problem constraints. + +**Contact Links** + +If you found this series helpful, please consider giving the **[repository](https://github.com/mah-shamim/leet-code-in-php)** a star on GitHub or sharing the post on your favorite social networks 😍. Your support would mean a lot to me! + +If you want more helpful content like this, feel free to follow me: + +- **[LinkedIn](https://www.linkedin.com/in/arifulhaque/)** +- **[GitHub](https://github.com/mah-shamim)** \ No newline at end of file