From e49ddc4e0bc3647137ae3e67db07d1329a0bd283 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 7 Feb 2025 19:56:19 +0800 Subject: [PATCH] feat: add solutions to lc problems: No.1880,1881 --- .../README.md | 99 ++++++++------ .../README_EN.md | 103 +++++++------- .../Solution.c | 15 +- .../Solution.cpp | 15 +- .../Solution.go | 9 +- .../Solution.java | 8 +- .../Solution.js | 12 +- .../Solution.py | 11 +- .../Solution.rs | 19 +-- .../Solution.ts | 10 +- .../README.md | 129 +++++++++++++----- .../README_EN.md | 129 +++++++++++++----- .../Solution.cpp | 21 +-- .../Solution.go | 11 +- .../Solution.java | 15 +- .../Solution.js | 20 +-- .../Solution.py | 17 ++- .../Solution.rs | 21 +++ .../Solution.ts | 14 ++ .../README.md | 20 --- .../README_EN.md | 20 --- .../Solution2.py | 15 -- 22 files changed, 431 insertions(+), 302 deletions(-) create mode 100644 solution/1800-1899/1881.Maximum Value after Insertion/Solution.rs create mode 100644 solution/1800-1899/1881.Maximum Value after Insertion/Solution.ts delete mode 100644 solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/Solution2.py diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/README.md b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/README.md index cbd14a9993e21..6fe968a1ad553 100644 --- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/README.md +++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/README.md @@ -79,7 +79,13 @@ targetWord 的数值为 "aaaa" -> "0000" -> 0 -### 方法一 +### 方法一:字符串转数字 + +我们定义一个函数 $\textit{f}(s)$,用来计算字符串 $s$ 的数值。对于字符串 $s$ 中的每个字符 $c$,我们将其转换为对应的数字 $x$,然后将 $x$ 依次连接起来,最后转换为整数。 + +最后,我们只需要判断 $\textit{f}(\textit{firstWord}) + \textit{f}(\textit{secondWord})$ 是否等于 $\textit{f}(\textit{targetWord})$ 即可。 + +时间复杂度 $O(L)$,其中 $L$ 为题目中所有字符串的长度之和。空间复杂度 $O(1)$。 @@ -88,11 +94,12 @@ targetWord 的数值为 "aaaa" -> "0000" -> 0 ```python class Solution: def isSumEqual(self, firstWord: str, secondWord: str, targetWord: str) -> bool: - def f(s): - res = 0 - for c in s: - res = res * 10 + (ord(c) - ord('a')) - return res + def f(s: str) -> int: + ans, a = 0, ord("a") + for c in map(ord, s): + x = c - a + ans = ans * 10 + x + return ans return f(firstWord) + f(secondWord) == f(targetWord) ``` @@ -106,11 +113,11 @@ class Solution { } private int f(String s) { - int res = 0; + int ans = 0; for (char c : s.toCharArray()) { - res = res * 10 + (c - 'a'); + ans = ans * 10 + (c - 'a'); } - return res; + return ans; } } ``` @@ -121,14 +128,15 @@ class Solution { class Solution { public: bool isSumEqual(string firstWord, string secondWord, string targetWord) { + auto f = [](string& s) -> int { + int ans = 0; + for (char c : s) { + ans = ans * 10 + (c - 'a'); + } + return ans; + }; return f(firstWord) + f(secondWord) == f(targetWord); } - - int f(string s) { - int res = 0; - for (char c : s) res = res * 10 + (c - 'a'); - return res; - } }; ``` @@ -136,12 +144,11 @@ public: ```go func isSumEqual(firstWord string, secondWord string, targetWord string) bool { - f := func(s string) int { - res := 0 + f := func(s string) (ans int) { for _, c := range s { - res = res*10 + int(c-'a') + ans = ans*10 + int(c-'a') } - return res + return } return f(firstWord)+f(secondWord) == f(targetWord) } @@ -151,14 +158,14 @@ func isSumEqual(firstWord string, secondWord string, targetWord string) bool { ```ts function isSumEqual(firstWord: string, secondWord: string, targetWord: string): boolean { - const calc = (s: string) => { - let res = 0; + const f = (s: string): number => { + let ans = 0; for (const c of s) { - res = res * 10 + c.charCodeAt(0) - 'a'.charCodeAt(0); + ans = ans * 10 + c.charCodeAt(0) - 97; } - return res; + return ans; }; - return calc(firstWord) + calc(secondWord) === calc(targetWord); + return f(firstWord) + f(secondWord) == f(targetWord); } ``` @@ -166,16 +173,17 @@ function isSumEqual(firstWord: string, secondWord: string, targetWord: string): ```rust impl Solution { - fn calc(s: &String) -> i32 { - let mut res = 0; - for c in s.as_bytes() { - res = res * 10 + ((c - b'a') as i32); - } - res - } - pub fn is_sum_equal(first_word: String, second_word: String, target_word: String) -> bool { - Self::calc(&first_word) + Self::calc(&second_word) == Self::calc(&target_word) + fn f(s: &str) -> i64 { + let mut ans = 0; + let a = 'a' as i64; + for c in s.chars() { + let x = c as i64 - a; + ans = ans * 10 + x; + } + ans + } + f(&first_word) + f(&second_word) == f(&target_word) } } ``` @@ -190,13 +198,13 @@ impl Solution { * @return {boolean} */ var isSumEqual = function (firstWord, secondWord, targetWord) { - function f(s) { - let res = 0; - for (let c of s) { - res = res * 10 + (c.charCodeAt() - 'a'.charCodeAt()); + const f = s => { + let ans = 0; + for (const c of s) { + ans = ans * 10 + c.charCodeAt(0) - 97; } - return res; - } + return ans; + }; return f(firstWord) + f(secondWord) == f(targetWord); }; ``` @@ -204,16 +212,17 @@ var isSumEqual = function (firstWord, secondWord, targetWord) { #### C ```c -int calc(char* s) { - int res = 0; - for (int i = 0; s[i]; i++) { - res = res * 10 + s[i] - 'a'; +int f(const char* s) { + int ans = 0; + while (*s) { + ans = ans * 10 + (*s - 'a'); + s++; } - return res; + return ans; } bool isSumEqual(char* firstWord, char* secondWord, char* targetWord) { - return calc(firstWord) + calc(secondWord) == calc(targetWord); + return f(firstWord) + f(secondWord) == f(targetWord); } ``` diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/README_EN.md b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/README_EN.md index 05b49365f3037..ddff890e66c5d 100644 --- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/README_EN.md +++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/README_EN.md @@ -48,7 +48,7 @@ We return true because 21 + 210 == 231.
 Input: firstWord = "aaa", secondWord = "a", targetWord = "aab"
 Output: false
-Explanation: 
+Explanation:
 The numerical value of firstWord is "aaa" -> "000" -> 0.
 The numerical value of secondWord is "a" -> "0" -> 0.
 The numerical value of targetWord is "aab" -> "001" -> 1.
@@ -60,7 +60,7 @@ We return false because 0 + 0 != 1.
 
 Input: firstWord = "aaa", secondWord = "a", targetWord = "aaaa"
 Output: true
-Explanation: 
+Explanation:
 The numerical value of firstWord is "aaa" -> "000" -> 0.
 The numerical value of secondWord is "a" -> "0" -> 0.
 The numerical value of targetWord is "aaaa" -> "0000" -> 0.
@@ -81,7 +81,13 @@ We return true because 0 + 0 == 0.
 
 
 
-### Solution 1
+### Solution 1: String to Number
+
+We define a function $\textit{f}(s)$ to calculate the numerical value of the string $s$. For each character $c$ in the string $s$, we convert it to the corresponding number $x$, then concatenate $x$ sequentially, and finally convert it to an integer.
+
+Finally, we just need to check whether $\textit{f}(\textit{firstWord}) + \textit{f}(\textit{secondWord})$ equals $\textit{f}(\textit{targetWord})$.
+
+The time complexity is $O(L)$, where $L$ is the sum of the lengths of all strings in the problem. The space complexity is $O(1)$.
 
 
 
@@ -90,11 +96,12 @@ We return true because 0 + 0 == 0.
 ```python
 class Solution:
     def isSumEqual(self, firstWord: str, secondWord: str, targetWord: str) -> bool:
-        def f(s):
-            res = 0
-            for c in s:
-                res = res * 10 + (ord(c) - ord('a'))
-            return res
+        def f(s: str) -> int:
+            ans, a = 0, ord("a")
+            for c in map(ord, s):
+                x = c - a
+                ans = ans * 10 + x
+            return ans
 
         return f(firstWord) + f(secondWord) == f(targetWord)
 ```
@@ -108,11 +115,11 @@ class Solution {
     }
 
     private int f(String s) {
-        int res = 0;
+        int ans = 0;
         for (char c : s.toCharArray()) {
-            res = res * 10 + (c - 'a');
+            ans = ans * 10 + (c - 'a');
         }
-        return res;
+        return ans;
     }
 }
 ```
@@ -123,14 +130,15 @@ class Solution {
 class Solution {
 public:
     bool isSumEqual(string firstWord, string secondWord, string targetWord) {
+        auto f = [](string& s) -> int {
+            int ans = 0;
+            for (char c : s) {
+                ans = ans * 10 + (c - 'a');
+            }
+            return ans;
+        };
         return f(firstWord) + f(secondWord) == f(targetWord);
     }
-
-    int f(string s) {
-        int res = 0;
-        for (char c : s) res = res * 10 + (c - 'a');
-        return res;
-    }
 };
 ```
 
@@ -138,12 +146,11 @@ public:
 
 ```go
 func isSumEqual(firstWord string, secondWord string, targetWord string) bool {
-	f := func(s string) int {
-		res := 0
+	f := func(s string) (ans int) {
 		for _, c := range s {
-			res = res*10 + int(c-'a')
+			ans = ans*10 + int(c-'a')
 		}
-		return res
+		return
 	}
 	return f(firstWord)+f(secondWord) == f(targetWord)
 }
@@ -153,14 +160,14 @@ func isSumEqual(firstWord string, secondWord string, targetWord string) bool {
 
 ```ts
 function isSumEqual(firstWord: string, secondWord: string, targetWord: string): boolean {
-    const calc = (s: string) => {
-        let res = 0;
+    const f = (s: string): number => {
+        let ans = 0;
         for (const c of s) {
-            res = res * 10 + c.charCodeAt(0) - 'a'.charCodeAt(0);
+            ans = ans * 10 + c.charCodeAt(0) - 97;
         }
-        return res;
+        return ans;
     };
-    return calc(firstWord) + calc(secondWord) === calc(targetWord);
+    return f(firstWord) + f(secondWord) == f(targetWord);
 }
 ```
 
@@ -168,16 +175,17 @@ function isSumEqual(firstWord: string, secondWord: string, targetWord: string):
 
 ```rust
 impl Solution {
-    fn calc(s: &String) -> i32 {
-        let mut res = 0;
-        for c in s.as_bytes() {
-            res = res * 10 + ((c - b'a') as i32);
-        }
-        res
-    }
-
     pub fn is_sum_equal(first_word: String, second_word: String, target_word: String) -> bool {
-        Self::calc(&first_word) + Self::calc(&second_word) == Self::calc(&target_word)
+        fn f(s: &str) -> i64 {
+            let mut ans = 0;
+            let a = 'a' as i64;
+            for c in s.chars() {
+                let x = c as i64 - a;
+                ans = ans * 10 + x;
+            }
+            ans
+        }
+        f(&first_word) + f(&second_word) == f(&target_word)
     }
 }
 ```
@@ -192,13 +200,13 @@ impl Solution {
  * @return {boolean}
  */
 var isSumEqual = function (firstWord, secondWord, targetWord) {
-    function f(s) {
-        let res = 0;
-        for (let c of s) {
-            res = res * 10 + (c.charCodeAt() - 'a'.charCodeAt());
+    const f = s => {
+        let ans = 0;
+        for (const c of s) {
+            ans = ans * 10 + c.charCodeAt(0) - 97;
         }
-        return res;
-    }
+        return ans;
+    };
     return f(firstWord) + f(secondWord) == f(targetWord);
 };
 ```
@@ -206,16 +214,17 @@ var isSumEqual = function (firstWord, secondWord, targetWord) {
 #### C
 
 ```c
-int calc(char* s) {
-    int res = 0;
-    for (int i = 0; s[i]; i++) {
-        res = res * 10 + s[i] - 'a';
+int f(const char* s) {
+    int ans = 0;
+    while (*s) {
+        ans = ans * 10 + (*s - 'a');
+        s++;
     }
-    return res;
+    return ans;
 }
 
 bool isSumEqual(char* firstWord, char* secondWord, char* targetWord) {
-    return calc(firstWord) + calc(secondWord) == calc(targetWord);
+    return f(firstWord) + f(secondWord) == f(targetWord);
 }
 ```
 
diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.c b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.c
index a1bb00e6737c4..911d6a023822b 100644
--- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.c	
+++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.c	
@@ -1,11 +1,12 @@
-int calc(char* s) {
-    int res = 0;
-    for (int i = 0; s[i]; i++) {
-        res = res * 10 + s[i] - 'a';
+int f(const char* s) {
+    int ans = 0;
+    while (*s) {
+        ans = ans * 10 + (*s - 'a');
+        s++;
     }
-    return res;
+    return ans;
 }
 
 bool isSumEqual(char* firstWord, char* secondWord, char* targetWord) {
-    return calc(firstWord) + calc(secondWord) == calc(targetWord);
-}
\ No newline at end of file
+    return f(firstWord) + f(secondWord) == f(targetWord);
+}
diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.cpp b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.cpp
index c99bfea49218e..78fa3fee75a01 100644
--- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.cpp	
+++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.cpp	
@@ -1,12 +1,13 @@
 class Solution {
 public:
     bool isSumEqual(string firstWord, string secondWord, string targetWord) {
+        auto f = [](string& s) -> int {
+            int ans = 0;
+            for (char c : s) {
+                ans = ans * 10 + (c - 'a');
+            }
+            return ans;
+        };
         return f(firstWord) + f(secondWord) == f(targetWord);
     }
-
-    int f(string s) {
-        int res = 0;
-        for (char c : s) res = res * 10 + (c - 'a');
-        return res;
-    }
-};
\ No newline at end of file
+};
diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.go b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.go
index 078fd0acdd22a..e6acff3256983 100644
--- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.go	
+++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.go	
@@ -1,10 +1,9 @@
 func isSumEqual(firstWord string, secondWord string, targetWord string) bool {
-	f := func(s string) int {
-		res := 0
+	f := func(s string) (ans int) {
 		for _, c := range s {
-			res = res*10 + int(c-'a')
+			ans = ans*10 + int(c-'a')
 		}
-		return res
+		return
 	}
 	return f(firstWord)+f(secondWord) == f(targetWord)
-}
\ No newline at end of file
+}
diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.java b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.java
index 515830162f97e..13706270f6ee2 100644
--- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.java	
+++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.java	
@@ -4,10 +4,10 @@ public boolean isSumEqual(String firstWord, String secondWord, String targetWord
     }
 
     private int f(String s) {
-        int res = 0;
+        int ans = 0;
         for (char c : s.toCharArray()) {
-            res = res * 10 + (c - 'a');
+            ans = ans * 10 + (c - 'a');
         }
-        return res;
+        return ans;
     }
-}
\ No newline at end of file
+}
diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.js b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.js
index 4c318298027d7..71396a6a9a703 100644
--- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.js	
+++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.js	
@@ -5,12 +5,12 @@
  * @return {boolean}
  */
 var isSumEqual = function (firstWord, secondWord, targetWord) {
-    function f(s) {
-        let res = 0;
-        for (let c of s) {
-            res = res * 10 + (c.charCodeAt() - 'a'.charCodeAt());
+    const f = s => {
+        let ans = 0;
+        for (const c of s) {
+            ans = ans * 10 + c.charCodeAt(0) - 97;
         }
-        return res;
-    }
+        return ans;
+    };
     return f(firstWord) + f(secondWord) == f(targetWord);
 };
diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.py b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.py
index bf6ffbe4a0f02..beb712b5986e6 100644
--- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.py	
+++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.py	
@@ -1,9 +1,10 @@
 class Solution:
     def isSumEqual(self, firstWord: str, secondWord: str, targetWord: str) -> bool:
-        def f(s):
-            res = 0
-            for c in s:
-                res = res * 10 + (ord(c) - ord('a'))
-            return res
+        def f(s: str) -> int:
+            ans, a = 0, ord("a")
+            for c in map(ord, s):
+                x = c - a
+                ans = ans * 10 + x
+            return ans
 
         return f(firstWord) + f(secondWord) == f(targetWord)
diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.rs b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.rs
index d7efedab6c5c1..6c992c69f2798 100644
--- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.rs	
+++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.rs	
@@ -1,13 +1,14 @@
 impl Solution {
-    fn calc(s: &String) -> i32 {
-        let mut res = 0;
-        for c in s.as_bytes() {
-            res = res * 10 + ((c - b'a') as i32);
-        }
-        res
-    }
-
     pub fn is_sum_equal(first_word: String, second_word: String, target_word: String) -> bool {
-        Self::calc(&first_word) + Self::calc(&second_word) == Self::calc(&target_word)
+        fn f(s: &str) -> i64 {
+            let mut ans = 0;
+            let a = 'a' as i64;
+            for c in s.chars() {
+                let x = c as i64 - a;
+                ans = ans * 10 + x;
+            }
+            ans
+        }
+        f(&first_word) + f(&second_word) == f(&target_word)
     }
 }
diff --git a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.ts b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.ts
index fe0cd1d3eab6b..0ff6002596ae1 100644
--- a/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.ts	
+++ b/solution/1800-1899/1880.Check if Word Equals Summation of Two Words/Solution.ts	
@@ -1,10 +1,10 @@
 function isSumEqual(firstWord: string, secondWord: string, targetWord: string): boolean {
-    const calc = (s: string) => {
-        let res = 0;
+    const f = (s: string): number => {
+        let ans = 0;
         for (const c of s) {
-            res = res * 10 + c.charCodeAt(0) - 'a'.charCodeAt(0);
+            ans = ans * 10 + c.charCodeAt(0) - 97;
         }
-        return res;
+        return ans;
     };
-    return calc(firstWord) + calc(secondWord) === calc(targetWord);
+    return f(firstWord) + f(secondWord) == f(targetWord);
 }
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/README.md b/solution/1800-1899/1881.Maximum Value after Insertion/README.md
index b173c8378f52e..70ad1beeb9aea 100644
--- a/solution/1800-1899/1881.Maximum Value after Insertion/README.md	
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/README.md	
@@ -66,7 +66,11 @@ tags:
 
 
 
-### 方法一
+### 方法一:贪心
+
+如果 $n$ 是负数,那么我们要找到第一个大于 $x$ 的位置,然后在这个位置插入 $x$;如果 $n$ 是正数,那么我们要找到第一个小于 $x$ 的位置,然后在这个位置插入 $x$。
+
+时间复杂度 $O(m)$,其中 $m$ 为 $n$ 的长度。空间复杂度 $O(1)$。
 
 
 
@@ -75,16 +79,15 @@ tags:
 ```python
 class Solution:
     def maxValue(self, n: str, x: int) -> str:
-        if n[0] != '-':
-            for i, c in enumerate(n):
-                if int(c) < x:
-                    return n[:i] + str(x) + n[i:]
-            return n + str(x)
+        i = 0
+        if n[0] == "-":
+            i += 1
+            while i < len(n) and int(n[i]) <= x:
+                i += 1
         else:
-            for i, c in enumerate(n[1:]):
-                if int(c) > x:
-                    return n[: i + 1] + str(x) + n[i + 1 :]
-            return n + str(x)
+            while i < len(n) and int(n[i]) >= x:
+                i += 1
+        return n[:i] + str(x) + n[i:]
 ```
 
 #### Java
@@ -93,12 +96,15 @@ class Solution:
 class Solution {
     public String maxValue(String n, int x) {
         int i = 0;
-        if (n.charAt(0) != '-') {
-            for (; i < n.length() && n.charAt(i) - '0' >= x; ++i)
-                ;
+        if (n.charAt(0) == '-') {
+            ++i;
+            while (i < n.length() && n.charAt(i) - '0' <= x) {
+                ++i;
+            }
         } else {
-            for (i = 1; i < n.length() && n.charAt(i) - '0' <= x; ++i)
-                ;
+            while (i < n.length() && n.charAt(i) - '0' >= x) {
+                ++i;
+            }
         }
         return n.substring(0, i) + x + n.substring(i);
     }
@@ -112,13 +118,18 @@ class Solution {
 public:
     string maxValue(string n, int x) {
         int i = 0;
-        if (n[0] != '-')
-            for (; i < n.size() && n[i] - '0' >= x; ++i)
-                ;
-        else
-            for (i = 1; i < n.size() && n[i] - '0' <= x; ++i)
-                ;
-        return n.substr(0, i) + to_string(x) + n.substr(i);
+        if (n[0] == '-') {
+            ++i;
+            while (i < n.size() && n[i] - '0' <= x) {
+                ++i;
+            }
+        } else {
+            while (i < n.size() && n[i] - '0' >= x) {
+                ++i;
+            }
+        }
+        n.insert(i, 1, x + '0');
+        return n;
     }
 };
 ```
@@ -129,17 +140,65 @@ public:
 func maxValue(n string, x int) string {
 	i := 0
 	y := byte('0' + x)
-	if n[0] != '-' {
-		for ; i < len(n) && n[i] >= y; i++ {
+	if n[0] == '-' {
+		i++
+		for i < len(n) && n[i] <= y {
+			i++
 		}
 	} else {
-		for i = 1; i < len(n) && n[i] <= y; i++ {
+		for i < len(n) && n[i] >= y {
+			i++
 		}
 	}
 	return n[:i] + string(y) + n[i:]
 }
 ```
 
+#### TypeScript
+
+```ts
+function maxValue(n: string, x: number): string {
+    let i = 0;
+    if (n[0] === '-') {
+        i++;
+        while (i < n.length && +n[i] <= x) {
+            i++;
+        }
+    } else {
+        while (i < n.length && +n[i] >= x) {
+            i++;
+        }
+    }
+    return n.slice(0, i) + x + n.slice(i);
+}
+```
+
+#### Rust
+
+```rust
+impl Solution {
+    pub fn max_value(n: String, x: i32) -> String {
+        let s = n.as_bytes();
+        let mut i = 0;
+        if n.starts_with('-') {
+            i += 1;
+            while i < s.len() && (s[i] - b'0') as i32 <= x {
+                i += 1;
+            }
+        } else {
+            while i < s.len() && (s[i] - b'0') as i32 >= x {
+                i += 1;
+            }
+        }
+        let mut ans = String::new();
+        ans.push_str(&n[0..i]);
+        ans.push_str(&x.to_string());
+        ans.push_str(&n[i..]);
+        ans
+    }
+}
+```
+
 #### JavaScript
 
 ```js
@@ -149,18 +208,18 @@ func maxValue(n string, x int) string {
  * @return {string}
  */
 var maxValue = function (n, x) {
-    let nums = [...n];
-    let sign = 1,
-        i = 0;
-    if (nums[0] == '-') {
-        sign = -1;
-        i++;
-    }
-    while (i < n.length && (nums[i] - x) * sign >= 0) {
+    let i = 0;
+    if (n[0] === '-') {
         i++;
+        while (i < n.length && +n[i] <= x) {
+            i++;
+        }
+    } else {
+        while (i < n.length && +n[i] >= x) {
+            i++;
+        }
     }
-    nums.splice(i, 0, x);
-    return nums.join('');
+    return n.slice(0, i) + x + n.slice(i);
 };
 ```
 
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/README_EN.md b/solution/1800-1899/1881.Maximum Value after Insertion/README_EN.md
index 40d9547510c30..aecc263a34960 100644
--- a/solution/1800-1899/1881.Maximum Value after Insertion/README_EN.md	
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/README_EN.md	
@@ -64,7 +64,11 @@ tags:
 
 
 
-### Solution 1
+### Solution 1: Greedy
+
+If $n$ is negative, we need to find the first position greater than $x$ and insert $x$ at that position. If $n$ is positive, we need to find the first position less than $x$ and insert $x$ at that position.
+
+The time complexity is $O(m)$, where $m$ is the length of $n$. The space complexity is $O(1)$.
 
 
 
@@ -73,16 +77,15 @@ tags:
 ```python
 class Solution:
     def maxValue(self, n: str, x: int) -> str:
-        if n[0] != '-':
-            for i, c in enumerate(n):
-                if int(c) < x:
-                    return n[:i] + str(x) + n[i:]
-            return n + str(x)
+        i = 0
+        if n[0] == "-":
+            i += 1
+            while i < len(n) and int(n[i]) <= x:
+                i += 1
         else:
-            for i, c in enumerate(n[1:]):
-                if int(c) > x:
-                    return n[: i + 1] + str(x) + n[i + 1 :]
-            return n + str(x)
+            while i < len(n) and int(n[i]) >= x:
+                i += 1
+        return n[:i] + str(x) + n[i:]
 ```
 
 #### Java
@@ -91,12 +94,15 @@ class Solution:
 class Solution {
     public String maxValue(String n, int x) {
         int i = 0;
-        if (n.charAt(0) != '-') {
-            for (; i < n.length() && n.charAt(i) - '0' >= x; ++i)
-                ;
+        if (n.charAt(0) == '-') {
+            ++i;
+            while (i < n.length() && n.charAt(i) - '0' <= x) {
+                ++i;
+            }
         } else {
-            for (i = 1; i < n.length() && n.charAt(i) - '0' <= x; ++i)
-                ;
+            while (i < n.length() && n.charAt(i) - '0' >= x) {
+                ++i;
+            }
         }
         return n.substring(0, i) + x + n.substring(i);
     }
@@ -110,13 +116,18 @@ class Solution {
 public:
     string maxValue(string n, int x) {
         int i = 0;
-        if (n[0] != '-')
-            for (; i < n.size() && n[i] - '0' >= x; ++i)
-                ;
-        else
-            for (i = 1; i < n.size() && n[i] - '0' <= x; ++i)
-                ;
-        return n.substr(0, i) + to_string(x) + n.substr(i);
+        if (n[0] == '-') {
+            ++i;
+            while (i < n.size() && n[i] - '0' <= x) {
+                ++i;
+            }
+        } else {
+            while (i < n.size() && n[i] - '0' >= x) {
+                ++i;
+            }
+        }
+        n.insert(i, 1, x + '0');
+        return n;
     }
 };
 ```
@@ -127,17 +138,65 @@ public:
 func maxValue(n string, x int) string {
 	i := 0
 	y := byte('0' + x)
-	if n[0] != '-' {
-		for ; i < len(n) && n[i] >= y; i++ {
+	if n[0] == '-' {
+		i++
+		for i < len(n) && n[i] <= y {
+			i++
 		}
 	} else {
-		for i = 1; i < len(n) && n[i] <= y; i++ {
+		for i < len(n) && n[i] >= y {
+			i++
 		}
 	}
 	return n[:i] + string(y) + n[i:]
 }
 ```
 
+#### TypeScript
+
+```ts
+function maxValue(n: string, x: number): string {
+    let i = 0;
+    if (n[0] === '-') {
+        i++;
+        while (i < n.length && +n[i] <= x) {
+            i++;
+        }
+    } else {
+        while (i < n.length && +n[i] >= x) {
+            i++;
+        }
+    }
+    return n.slice(0, i) + x + n.slice(i);
+}
+```
+
+#### Rust
+
+```rust
+impl Solution {
+    pub fn max_value(n: String, x: i32) -> String {
+        let s = n.as_bytes();
+        let mut i = 0;
+        if n.starts_with('-') {
+            i += 1;
+            while i < s.len() && (s[i] - b'0') as i32 <= x {
+                i += 1;
+            }
+        } else {
+            while i < s.len() && (s[i] - b'0') as i32 >= x {
+                i += 1;
+            }
+        }
+        let mut ans = String::new();
+        ans.push_str(&n[0..i]);
+        ans.push_str(&x.to_string());
+        ans.push_str(&n[i..]);
+        ans
+    }
+}
+```
+
 #### JavaScript
 
 ```js
@@ -147,18 +206,18 @@ func maxValue(n string, x int) string {
  * @return {string}
  */
 var maxValue = function (n, x) {
-    let nums = [...n];
-    let sign = 1,
-        i = 0;
-    if (nums[0] == '-') {
-        sign = -1;
-        i++;
-    }
-    while (i < n.length && (nums[i] - x) * sign >= 0) {
+    let i = 0;
+    if (n[0] === '-') {
         i++;
+        while (i < n.length && +n[i] <= x) {
+            i++;
+        }
+    } else {
+        while (i < n.length && +n[i] >= x) {
+            i++;
+        }
     }
-    nums.splice(i, 0, x);
-    return nums.join('');
+    return n.slice(0, i) + x + n.slice(i);
 };
 ```
 
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.cpp b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.cpp
index 741a185b3a2fe..288ab7d427dfb 100644
--- a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.cpp	
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.cpp	
@@ -2,12 +2,17 @@ class Solution {
 public:
     string maxValue(string n, int x) {
         int i = 0;
-        if (n[0] != '-')
-            for (; i < n.size() && n[i] - '0' >= x; ++i)
-                ;
-        else
-            for (i = 1; i < n.size() && n[i] - '0' <= x; ++i)
-                ;
-        return n.substr(0, i) + to_string(x) + n.substr(i);
+        if (n[0] == '-') {
+            ++i;
+            while (i < n.size() && n[i] - '0' <= x) {
+                ++i;
+            }
+        } else {
+            while (i < n.size() && n[i] - '0' >= x) {
+                ++i;
+            }
+        }
+        n.insert(i, 1, x + '0');
+        return n;
     }
-};
\ No newline at end of file
+};
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.go b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.go
index 9495224afd454..c4f2dbabab0e7 100644
--- a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.go	
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.go	
@@ -1,12 +1,15 @@
 func maxValue(n string, x int) string {
 	i := 0
 	y := byte('0' + x)
-	if n[0] != '-' {
-		for ; i < len(n) && n[i] >= y; i++ {
+	if n[0] == '-' {
+		i++
+		for i < len(n) && n[i] <= y {
+			i++
 		}
 	} else {
-		for i = 1; i < len(n) && n[i] <= y; i++ {
+		for i < len(n) && n[i] >= y {
+			i++
 		}
 	}
 	return n[:i] + string(y) + n[i:]
-}
\ No newline at end of file
+}
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.java b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.java
index 561382a45fcd9..c12035d645ede 100644
--- a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.java	
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.java	
@@ -1,13 +1,16 @@
 class Solution {
     public String maxValue(String n, int x) {
         int i = 0;
-        if (n.charAt(0) != '-') {
-            for (; i < n.length() && n.charAt(i) - '0' >= x; ++i)
-                ;
+        if (n.charAt(0) == '-') {
+            ++i;
+            while (i < n.length() && n.charAt(i) - '0' <= x) {
+                ++i;
+            }
         } else {
-            for (i = 1; i < n.length() && n.charAt(i) - '0' <= x; ++i)
-                ;
+            while (i < n.length() && n.charAt(i) - '0' >= x) {
+                ++i;
+            }
         }
         return n.substring(0, i) + x + n.substring(i);
     }
-}
\ No newline at end of file
+}
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.js b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.js
index 1230394b45ac9..7d7654ceb0533 100644
--- a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.js	
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.js	
@@ -4,16 +4,16 @@
  * @return {string}
  */
 var maxValue = function (n, x) {
-    let nums = [...n];
-    let sign = 1,
-        i = 0;
-    if (nums[0] == '-') {
-        sign = -1;
+    let i = 0;
+    if (n[0] === '-') {
         i++;
+        while (i < n.length && +n[i] <= x) {
+            i++;
+        }
+    } else {
+        while (i < n.length && +n[i] >= x) {
+            i++;
+        }
     }
-    while (i < n.length && (nums[i] - x) * sign >= 0) {
-        i++;
-    }
-    nums.splice(i, 0, x);
-    return nums.join('');
+    return n.slice(0, i) + x + n.slice(i);
 };
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.py b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.py
index e4be323d18bcf..422d93774e73b 100644
--- a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.py	
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.py	
@@ -1,12 +1,11 @@
 class Solution:
     def maxValue(self, n: str, x: int) -> str:
-        if n[0] != '-':
-            for i, c in enumerate(n):
-                if int(c) < x:
-                    return n[:i] + str(x) + n[i:]
-            return n + str(x)
+        i = 0
+        if n[0] == "-":
+            i += 1
+            while i < len(n) and int(n[i]) <= x:
+                i += 1
         else:
-            for i, c in enumerate(n[1:]):
-                if int(c) > x:
-                    return n[: i + 1] + str(x) + n[i + 1 :]
-            return n + str(x)
+            while i < len(n) and int(n[i]) >= x:
+                i += 1
+        return n[:i] + str(x) + n[i:]
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.rs b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.rs
new file mode 100644
index 0000000000000..f4e69ccb10110
--- /dev/null
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.rs	
@@ -0,0 +1,21 @@
+impl Solution {
+    pub fn max_value(n: String, x: i32) -> String {
+        let s = n.as_bytes();
+        let mut i = 0;
+        if n.starts_with('-') {
+            i += 1;
+            while i < s.len() && (s[i] - b'0') as i32 <= x {
+                i += 1;
+            }
+        } else {
+            while i < s.len() && (s[i] - b'0') as i32 >= x {
+                i += 1;
+            }
+        }
+        let mut ans = String::new();
+        ans.push_str(&n[0..i]);
+        ans.push_str(&x.to_string());
+        ans.push_str(&n[i..]);
+        ans
+    }
+}
diff --git a/solution/1800-1899/1881.Maximum Value after Insertion/Solution.ts b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.ts
new file mode 100644
index 0000000000000..85ec7156a4c8d
--- /dev/null
+++ b/solution/1800-1899/1881.Maximum Value after Insertion/Solution.ts	
@@ -0,0 +1,14 @@
+function maxValue(n: string, x: number): string {
+    let i = 0;
+    if (n[0] === '-') {
+        i++;
+        while (i < n.length && +n[i] <= x) {
+            i++;
+        }
+    } else {
+        while (i < n.length && +n[i] >= x) {
+            i++;
+        }
+    }
+    return n.slice(0, i) + x + n.slice(i);
+}
diff --git a/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README.md b/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README.md
index 47a865c2a7a1e..5bf71a6bf5fed 100644
--- a/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README.md	
+++ b/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README.md	
@@ -123,26 +123,6 @@ class Solution:
         return -1
 ```
 
-#### Python3
-
-```python
-class Solution:
-    def minSkips(self, dist: List[int], speed: int, hoursBefore: int) -> int:
-        n = len(dist)
-        f = [[inf] * (n + 1) for _ in range(n + 1)]
-        f[0][0] = 0
-        for i, x in enumerate(dist, 1):
-            for j in range(i + 1):
-                if j < i:
-                    f[i][j] = min(f[i][j], ((f[i - 1][j] + x - 1) // speed + 1) * speed)
-                if j:
-                    f[i][j] = min(f[i][j], f[i - 1][j - 1] + x)
-        for j in range(n + 1):
-            if f[n][j] <= hoursBefore * speed:
-                return j
-        return -1
-```
-
 #### Java
 
 ```java
diff --git a/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README_EN.md b/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README_EN.md
index 0599c4e55362d..fe31fcf498132 100644
--- a/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README_EN.md	
+++ b/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README_EN.md	
@@ -121,26 +121,6 @@ class Solution:
         return -1
 ```
 
-#### Python3
-
-```python
-class Solution:
-    def minSkips(self, dist: List[int], speed: int, hoursBefore: int) -> int:
-        n = len(dist)
-        f = [[inf] * (n + 1) for _ in range(n + 1)]
-        f[0][0] = 0
-        for i, x in enumerate(dist, 1):
-            for j in range(i + 1):
-                if j < i:
-                    f[i][j] = min(f[i][j], ((f[i - 1][j] + x - 1) // speed + 1) * speed)
-                if j:
-                    f[i][j] = min(f[i][j], f[i - 1][j - 1] + x)
-        for j in range(n + 1):
-            if f[n][j] <= hoursBefore * speed:
-                return j
-        return -1
-```
-
 #### Java
 
 ```java
diff --git a/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/Solution2.py b/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/Solution2.py
deleted file mode 100644
index 06610ad5f6901..0000000000000
--- a/solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/Solution2.py	
+++ /dev/null
@@ -1,15 +0,0 @@
-class Solution:
-    def minSkips(self, dist: List[int], speed: int, hoursBefore: int) -> int:
-        n = len(dist)
-        f = [[inf] * (n + 1) for _ in range(n + 1)]
-        f[0][0] = 0
-        for i, x in enumerate(dist, 1):
-            for j in range(i + 1):
-                if j < i:
-                    f[i][j] = min(f[i][j], ((f[i - 1][j] + x - 1) // speed + 1) * speed)
-                if j:
-                    f[i][j] = min(f[i][j], f[i - 1][j - 1] + x)
-        for j in range(n + 1):
-            if f[n][j] <= hoursBefore * speed:
-                return j
-        return -1