From 4991737bc48f2691e885c7695607532d0adef03b Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Mon, 27 Oct 2025 18:20:42 +0200 Subject: [PATCH] Improved task 8 --- .../s0008_string_to_integer_atoi/readme.md | 97 ++++++++++++------- 1 file changed, 60 insertions(+), 37 deletions(-) diff --git a/src/main/java/g0001_0100/s0008_string_to_integer_atoi/readme.md b/src/main/java/g0001_0100/s0008_string_to_integer_atoi/readme.md index 743eb17cc..86bc9f4fd 100644 --- a/src/main/java/g0001_0100/s0008_string_to_integer_atoi/readme.md +++ b/src/main/java/g0001_0100/s0008_string_to_integer_atoi/readme.md @@ -2,16 +2,21 @@ Medium -Implement the `myAtoi(string s)` function, which converts a string to a 32-bit signed integer. +Implement the `myAtoi(string s)` function, which converts a string to a 32-bit signed integer (similar to C/C++'s `atoi` function). The algorithm for `myAtoi(string s)` is as follows: -1. **Whitespace**: Ignore any leading whitespace (`" "`). -2. **Signedness**: Determine the sign by checking if the next character is `'-'` or `'+'`, assuming positivity if neither present. -3. **Conversion**: Read the integer by skipping leading zeros until a non-digit character is encountered or the end of the string is reached. If no digits were read, then the result is 0. -4. **Rounding**: If the integer is out of the 32-bit signed integer range [-231, 231 - 1], then round the integer to remain in the range. Specifically, integers less than -231 should be rounded to -231, and integers greater than 231 - 1 should be rounded to 231 - 1. +1. Read in and ignore any leading whitespace. +2. Check if the next character (if not already at the end of the string) is `'-'` or `'+'`. Read this character in if it is either. This determines if the final result is negative or positive respectively. Assume the result is positive if neither is present. +3. Read in next the characters until the next non-digit character or the end of the input is reached. The rest of the string is ignored. +4. Convert these digits into an integer (i.e. `"123" -> 123`, `"0032" -> 32`). If no digits were read, then the integer is `0`. Change the sign as necessary (from step 2). +5. If the integer is out of the 32-bit signed integer range [-231, 231 - 1], then clamp the integer so that it remains in the range. Specifically, integers less than -231 should be clamped to -231, and integers greater than 231 - 1 should be clamped to 231 - 1. +6. Return the integer as the final result. -Return the integer as the final result. +**Note:** + +* Only the space character `' '` is considered a whitespace character. +* **Do not ignore** any characters other than the leading whitespace or the rest of the string after the digits. **Example 1:** @@ -19,70 +24,93 @@ Return the integer as the final result. **Output:** 42 -**Explanation:** +**Explanation:** The underlined characters are what is read in, the caret is the current reader position. - The underlined characters are what is read in and the caret is the current reader position. Step 1: "42" (no characters read because there is no leading whitespace) - ^ + ^ Step 2: "42" (no characters read because there is neither a '-' nor '+') ^ Step 3: "42" ("42" is read in) - ^ + ^ + +The parsed integer is 42. Since 42 is in the range [-231, 231 - 1], the final result is 42. **Example 2:** -**Input:** s = " -042" +**Input:** s = " -42" -**Output:** \-42 +**Output:** -42 **Explanation:** - Step 1: "___-042" (leading whitespace is read and ignored) - ^ - Step 2: " -042" ('-' is read, so the result should be negative) - ^ - Step 3: " -042" ("042" is read in, leading zeros ignored in the result) - ^ + Step 1: " -42" (leading whitespace is read and ignored) + ^ + Step 2: " -42" ('-' is read, so the result should be negative) + ^ + Step 3: " -42" ("42" is read in) + ^ + The parsed integer is -42. + +Since -42 is in the range [-231, 231 - 1], the final result is -42. **Example 3:** -**Input:** s = "1337c0d3" +**Input:** s = "4193 with words" -**Output:** 1337 +**Output:** 4193 **Explanation:** - Step 1: "1337c0d3" (no characters read because there is no leading whitespace) + Step 1: "4193 with words" (no characters read because there is no leading whitespace) ^ - Step 2: "1337c0d3" (no characters read because there is neither a '-' nor '+') + Step 2: "4193 with words" (no characters read because there is neither a '-' nor '+') ^ - Step 3: "1337c0d3" ("1337" is read in; reading stops because the next character is a non-digit) + Step 3: "4193 with words" ("4193" is read in; reading stops because the next character is a non-digit) ^ + The parsed integer is 4193. + +Since 4193 is in the range [-231, 231 - 1], the final result is 4193. **Example 4:** -**Input:** s = "0-1" +**Input:** s = "words and 987" **Output:** 0 **Explanation:** - Step 1: "0-1" (no characters read because there is no leading whitespace) + Step 1: "words and 987" (no characters read because there is no leading whitespace) ^ - Step 2: "0-1" (no characters read because there is neither a '-' nor '+') + Step 2: "words and 987" (no characters read because there is neither a '-' nor '+') ^ - Step 3: "0-1" ("0" is read in; reading stops because the next character is a non-digit) - ^ + Step 3: "words and 987" (reading stops immediately because there is a non-digit 'w') + ^ + The parsed integer is 0 because no digits were read. + +Since 0 is in the range [-231, 231 - 1], the final result is 0. **Example 5:** -**Input:** s = "words and 987" +**Input:** s = "-91283472332" -**Output:** 0 +**Output:** -2147483648 **Explanation:** -Reading stops at the first non-digit character 'w'. + Step 1: "-91283472332" (no characters read because there is no leading whitespace) + ^ + Step 2: "-91283472332" ('-' is read, so the result should be negative) + ^ + Step 3: "-91283472332" ("91283472332" is read in) + ^ + The parsed integer is -91283472332. + +Since -91283472332 is less than the lower bound of the range [-231, 231 - 1], the final result is clamped to -231 = -2147483648. + +**Constraints:** + +* `0 <= s.length <= 200` +* `s` consists of English letters (lower-case and upper-case), digits (`0-9`), `' '`, `'+'`, `'-'`, and `'.'`. To solve the String to Integer (atoi) problem in Java using a `Solution` class, we'll follow these steps: @@ -153,9 +181,4 @@ public class Solution { } ``` -This implementation provides a solution to the String to Integer (atoi) problem in Java. - -**Constraints:** - -* `0 <= s.length <= 200` -* `s` consists of English letters (lower-case and upper-case), digits (`0-9`), `' '`, `'+'`, `'-'`, and `'.'`. +This implementation provides a solution to the String to Integer (atoi) problem in Java. \ No newline at end of file