diff --git a/solution/0300-0399/0393.UTF-8 Validation/README.md b/solution/0300-0399/0393.UTF-8 Validation/README.md index a5b2847436c4c..c505a6e2d7044 100644 --- a/solution/0300-0399/0393.UTF-8 Validation/README.md +++ b/solution/0300-0399/0393.UTF-8 Validation/README.md @@ -79,7 +79,22 @@ tags: -### 方法一 +### 方法一:一次遍历 + +我们用一个变量 $cnt$ 记录当前需要填充的以 $10$ 开头的字节的个数,初始时 $cnt = 0$。 + +遍历数组中的每个整数,对于每个整数 $v$: + +- 如果 $cnt > 0$,则判断 $v$ 是否以 $10$ 开头,如果不是,则返回 `false`,否则 $cnt$ 减一。 +- 如果 $v$ 的最高位为 $0$,则 $cnt = 0$。 +- 如果 $v$ 的最高两位为 $110$,则 $cnt = 1$。 +- 如果 $v$ 的最高三位为 $1110$,则 $cnt = 2$。 +- 如果 $v$ 的最高四位为 $11110$,则 $cnt = 3$。 +- 否则,返回 `false`。 + +最后,如果 $cnt = 0$,则返回 `true`,否则返回 `false`。 + +时间复杂度 $O(n)$,其中 $n$ 为数组 `data` 的长度。空间复杂度 $O(1)$。 @@ -88,23 +103,23 @@ tags: ```python class Solution: def validUtf8(self, data: List[int]) -> bool: - n = 0 + cnt = 0 for v in data: - if n > 0: + if cnt > 0: if v >> 6 != 0b10: return False - n -= 1 + cnt -= 1 elif v >> 7 == 0: - n = 0 + cnt = 0 elif v >> 5 == 0b110: - n = 1 + cnt = 1 elif v >> 4 == 0b1110: - n = 2 + cnt = 2 elif v >> 3 == 0b11110: - n = 3 + cnt = 3 else: return False - return n == 0 + return cnt == 0 ``` #### Java @@ -112,26 +127,26 @@ class Solution: ```java class Solution { public boolean validUtf8(int[] data) { - int n = 0; + int cnt = 0; for (int v : data) { - if (n > 0) { + if (cnt > 0) { if (v >> 6 != 0b10) { return false; } - --n; + --cnt; } else if (v >> 7 == 0) { - n = 0; + cnt = 0; } else if (v >> 5 == 0b110) { - n = 1; + cnt = 1; } else if (v >> 4 == 0b1110) { - n = 2; + cnt = 2; } else if (v >> 3 == 0b11110) { - n = 3; + cnt = 3; } else { return false; } } - return n == 0; + return cnt == 0; } } ``` @@ -142,23 +157,26 @@ class Solution { class Solution { public: bool validUtf8(vector& data) { - int n = 0; + int cnt = 0; for (int& v : data) { - if (n > 0) { - if (v >> 6 != 0b10) return false; - --n; - } else if (v >> 7 == 0) - n = 0; - else if (v >> 5 == 0b110) - n = 1; - else if (v >> 4 == 0b1110) - n = 2; - else if (v >> 3 == 0b11110) - n = 3; - else + if (cnt > 0) { + if (v >> 6 != 0b10) { + return false; + } + --cnt; + } else if (v >> 7 == 0) { + cnt = 0; + } else if (v >> 5 == 0b110) { + cnt = 1; + } else if (v >> 4 == 0b1110) { + cnt = 2; + } else if (v >> 3 == 0b11110) { + cnt = 3; + } else { return false; + } } - return n == 0; + return cnt == 0; } }; ``` @@ -167,26 +185,53 @@ public: ```go func validUtf8(data []int) bool { - n := 0 + cnt := 0 for _, v := range data { - if n > 0 { + if cnt > 0 { if v>>6 != 0b10 { return false } - n-- + cnt-- } else if v>>7 == 0 { - n = 0 + cnt = 0 } else if v>>5 == 0b110 { - n = 1 + cnt = 1 } else if v>>4 == 0b1110 { - n = 2 + cnt = 2 } else if v>>3 == 0b11110 { - n = 3 + cnt = 3 } else { return false } } - return n == 0 + return cnt == 0 +} +``` + +#### TypeScript + +```ts +function validUtf8(data: number[]): boolean { + let cnt = 0; + for (const v of data) { + if (cnt > 0) { + if (v >> 6 != 0b10) { + return false; + } + --cnt; + } else if (v >> 7 == 0) { + cnt = 0; + } else if (v >> 5 == 0b110) { + cnt = 1; + } else if (v >> 4 == 0b1110) { + cnt = 2; + } else if (v >> 3 == 0b11110) { + cnt = 3; + } else { + return false; + } + } + return cnt == 0; } ``` diff --git a/solution/0300-0399/0393.UTF-8 Validation/README_EN.md b/solution/0300-0399/0393.UTF-8 Validation/README_EN.md index aaa12b6136e93..b2710dec15dcd 100644 --- a/solution/0300-0399/0393.UTF-8 Validation/README_EN.md +++ b/solution/0300-0399/0393.UTF-8 Validation/README_EN.md @@ -77,7 +77,22 @@ But the second continuation byte does not start with 10, so it is invalid. -### Solution 1 +### Solution 1: Single Pass + +We use a variable $cnt$ to record the current number of bytes that need to be filled starting with $10$, initially $cnt = 0$. + +For each integer $v$ in the array: + +- If $cnt > 0$, then check if $v$ starts with $10$. If not, return `false`, otherwise decrement $cnt$. +- If the highest bit of $v$ is $0$, then $cnt = 0$. +- If the highest two bits of $v$ are $110$, then $cnt = 1$. +- If the highest three bits of $v$ are $1110$, then $cnt = 2$. +- If the highest four bits of $v$ are $11110$, then $cnt = 3$. +- Otherwise, return `false`. + +Finally, if $cnt = 0$, return `true`, otherwise return `false`. + +The time complexity is $O(n)$, where $n$ is the length of the array `data`. The space complexity is $O(1)$. @@ -86,23 +101,23 @@ But the second continuation byte does not start with 10, so it is invalid. ```python class Solution: def validUtf8(self, data: List[int]) -> bool: - n = 0 + cnt = 0 for v in data: - if n > 0: + if cnt > 0: if v >> 6 != 0b10: return False - n -= 1 + cnt -= 1 elif v >> 7 == 0: - n = 0 + cnt = 0 elif v >> 5 == 0b110: - n = 1 + cnt = 1 elif v >> 4 == 0b1110: - n = 2 + cnt = 2 elif v >> 3 == 0b11110: - n = 3 + cnt = 3 else: return False - return n == 0 + return cnt == 0 ``` #### Java @@ -110,26 +125,26 @@ class Solution: ```java class Solution { public boolean validUtf8(int[] data) { - int n = 0; + int cnt = 0; for (int v : data) { - if (n > 0) { + if (cnt > 0) { if (v >> 6 != 0b10) { return false; } - --n; + --cnt; } else if (v >> 7 == 0) { - n = 0; + cnt = 0; } else if (v >> 5 == 0b110) { - n = 1; + cnt = 1; } else if (v >> 4 == 0b1110) { - n = 2; + cnt = 2; } else if (v >> 3 == 0b11110) { - n = 3; + cnt = 3; } else { return false; } } - return n == 0; + return cnt == 0; } } ``` @@ -140,23 +155,26 @@ class Solution { class Solution { public: bool validUtf8(vector& data) { - int n = 0; + int cnt = 0; for (int& v : data) { - if (n > 0) { - if (v >> 6 != 0b10) return false; - --n; - } else if (v >> 7 == 0) - n = 0; - else if (v >> 5 == 0b110) - n = 1; - else if (v >> 4 == 0b1110) - n = 2; - else if (v >> 3 == 0b11110) - n = 3; - else + if (cnt > 0) { + if (v >> 6 != 0b10) { + return false; + } + --cnt; + } else if (v >> 7 == 0) { + cnt = 0; + } else if (v >> 5 == 0b110) { + cnt = 1; + } else if (v >> 4 == 0b1110) { + cnt = 2; + } else if (v >> 3 == 0b11110) { + cnt = 3; + } else { return false; + } } - return n == 0; + return cnt == 0; } }; ``` @@ -165,26 +183,53 @@ public: ```go func validUtf8(data []int) bool { - n := 0 + cnt := 0 for _, v := range data { - if n > 0 { + if cnt > 0 { if v>>6 != 0b10 { return false } - n-- + cnt-- } else if v>>7 == 0 { - n = 0 + cnt = 0 } else if v>>5 == 0b110 { - n = 1 + cnt = 1 } else if v>>4 == 0b1110 { - n = 2 + cnt = 2 } else if v>>3 == 0b11110 { - n = 3 + cnt = 3 } else { return false } } - return n == 0 + return cnt == 0 +} +``` + +#### TypeScript + +```ts +function validUtf8(data: number[]): boolean { + let cnt = 0; + for (const v of data) { + if (cnt > 0) { + if (v >> 6 != 0b10) { + return false; + } + --cnt; + } else if (v >> 7 == 0) { + cnt = 0; + } else if (v >> 5 == 0b110) { + cnt = 1; + } else if (v >> 4 == 0b1110) { + cnt = 2; + } else if (v >> 3 == 0b11110) { + cnt = 3; + } else { + return false; + } + } + return cnt == 0; } ``` diff --git a/solution/0300-0399/0393.UTF-8 Validation/Solution.cpp b/solution/0300-0399/0393.UTF-8 Validation/Solution.cpp index 551f0e4879ef6..af5ccb3ede992 100644 --- a/solution/0300-0399/0393.UTF-8 Validation/Solution.cpp +++ b/solution/0300-0399/0393.UTF-8 Validation/Solution.cpp @@ -1,22 +1,25 @@ class Solution { public: bool validUtf8(vector& data) { - int n = 0; + int cnt = 0; for (int& v : data) { - if (n > 0) { - if (v >> 6 != 0b10) return false; - --n; - } else if (v >> 7 == 0) - n = 0; - else if (v >> 5 == 0b110) - n = 1; - else if (v >> 4 == 0b1110) - n = 2; - else if (v >> 3 == 0b11110) - n = 3; - else + if (cnt > 0) { + if (v >> 6 != 0b10) { + return false; + } + --cnt; + } else if (v >> 7 == 0) { + cnt = 0; + } else if (v >> 5 == 0b110) { + cnt = 1; + } else if (v >> 4 == 0b1110) { + cnt = 2; + } else if (v >> 3 == 0b11110) { + cnt = 3; + } else { return false; + } } - return n == 0; + return cnt == 0; } }; \ No newline at end of file diff --git a/solution/0300-0399/0393.UTF-8 Validation/Solution.go b/solution/0300-0399/0393.UTF-8 Validation/Solution.go index a3b0ca57b9f65..34e85c576a478 100644 --- a/solution/0300-0399/0393.UTF-8 Validation/Solution.go +++ b/solution/0300-0399/0393.UTF-8 Validation/Solution.go @@ -1,22 +1,22 @@ func validUtf8(data []int) bool { - n := 0 + cnt := 0 for _, v := range data { - if n > 0 { + if cnt > 0 { if v>>6 != 0b10 { return false } - n-- + cnt-- } else if v>>7 == 0 { - n = 0 + cnt = 0 } else if v>>5 == 0b110 { - n = 1 + cnt = 1 } else if v>>4 == 0b1110 { - n = 2 + cnt = 2 } else if v>>3 == 0b11110 { - n = 3 + cnt = 3 } else { return false } } - return n == 0 + return cnt == 0 } \ No newline at end of file diff --git a/solution/0300-0399/0393.UTF-8 Validation/Solution.java b/solution/0300-0399/0393.UTF-8 Validation/Solution.java index 619ed5e6ea9e1..91435c2aaee66 100644 --- a/solution/0300-0399/0393.UTF-8 Validation/Solution.java +++ b/solution/0300-0399/0393.UTF-8 Validation/Solution.java @@ -1,24 +1,24 @@ class Solution { public boolean validUtf8(int[] data) { - int n = 0; + int cnt = 0; for (int v : data) { - if (n > 0) { + if (cnt > 0) { if (v >> 6 != 0b10) { return false; } - --n; + --cnt; } else if (v >> 7 == 0) { - n = 0; + cnt = 0; } else if (v >> 5 == 0b110) { - n = 1; + cnt = 1; } else if (v >> 4 == 0b1110) { - n = 2; + cnt = 2; } else if (v >> 3 == 0b11110) { - n = 3; + cnt = 3; } else { return false; } } - return n == 0; + return cnt == 0; } } \ No newline at end of file diff --git a/solution/0300-0399/0393.UTF-8 Validation/Solution.py b/solution/0300-0399/0393.UTF-8 Validation/Solution.py index 5f44a4b493a36..d616b047c7b77 100644 --- a/solution/0300-0399/0393.UTF-8 Validation/Solution.py +++ b/solution/0300-0399/0393.UTF-8 Validation/Solution.py @@ -1,19 +1,19 @@ class Solution: def validUtf8(self, data: List[int]) -> bool: - n = 0 + cnt = 0 for v in data: - if n > 0: + if cnt > 0: if v >> 6 != 0b10: return False - n -= 1 + cnt -= 1 elif v >> 7 == 0: - n = 0 + cnt = 0 elif v >> 5 == 0b110: - n = 1 + cnt = 1 elif v >> 4 == 0b1110: - n = 2 + cnt = 2 elif v >> 3 == 0b11110: - n = 3 + cnt = 3 else: return False - return n == 0 + return cnt == 0 diff --git a/solution/0300-0399/0393.UTF-8 Validation/Solution.ts b/solution/0300-0399/0393.UTF-8 Validation/Solution.ts new file mode 100644 index 0000000000000..9c939e7026c60 --- /dev/null +++ b/solution/0300-0399/0393.UTF-8 Validation/Solution.ts @@ -0,0 +1,22 @@ +function validUtf8(data: number[]): boolean { + let cnt = 0; + for (const v of data) { + if (cnt > 0) { + if (v >> 6 !== 0b10) { + return false; + } + --cnt; + } else if (v >> 7 === 0) { + cnt = 0; + } else if (v >> 5 === 0b110) { + cnt = 1; + } else if (v >> 4 === 0b1110) { + cnt = 2; + } else if (v >> 3 === 0b11110) { + cnt = 3; + } else { + return false; + } + } + return cnt === 0; +}