首先题目给出一个只包含数字且下标从 0 开始长度为 n 的字符串 num。现在我们需要判断字符串 num 是否每一个位置 i,0 \le i < n 都满足数字 i 在 num 中出现了 num}[i] 次。那么我们首先将 num 中的每一个数字用哈希表做一个统计,然后遍历每一个位置来判断是否满足要求即可。
代码
[sol1-Python3]
1 2 3 4 5 6 7
classSolution: defdigitCount(self, num: str) -> bool: h = Counter(num) for idx, v inenumerate(num): if h[str(idx)] != int(v): returnFalse returnTrue
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { publicbooleandigitCount(String num) { Map<Integer, Integer> h = newHashMap<Integer, Integer>(); intn= num.length(); for (inti=0; i < n; i++) { intdigit= num.charAt(i) - '0'; h.put(digit, h.getOrDefault(digit, 0) + 1); } for (inti=0; i < n; i++) { intv= num.charAt(i) - '0'; if (h.getOrDefault(i, 0) != v) { returnfalse; } } returntrue; } }
[sol1-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
publicclassSolution { publicboolDigitCount(string num) { IDictionary<int, int> h = new Dictionary<int, int>(); int n = num.Length; for (int i = 0; i < n; i++) { int digit = num[i] - '0'; h.TryAdd(digit, 0); h[digit]++; } for (int i = 0; i < n; i++) { int v = num[i] - '0'; h.TryAdd(i, 0); if (h[i] != v) { returnfalse; } } returntrue; } }
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { public: booldigitCount(string num){ unordered_map<int, int> h; int n = num.size(); for (int i = 0; i < n; i++) { h[num[i] - '0']++; } for (int i = 0; i < n; i++) { int v = num[i] - '0'; if (h[i] != v) { returnfalse; } } returntrue; } };
[sol1-C]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
booldigitCount(char * num) { int h[16]; memset(h, 0, sizeof(h)); int n = strlen(num); for (int i = 0; i < n; i++) { h[num[i] - '0']++; } for (int i = 0; i < n; i++) { int v = num[i] - '0'; if (h[i] != v) { returnfalse; } } returntrue; }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var digitCount = function(num) { const h = newMap(); const n = num.length; for (let i = 0; i < n; i++) { const digit = num[i].charCodeAt() - '0'.charCodeAt(); h.set(digit, (h.get(digit) || 0) + 1); } for (let i = 0; i < n; i++) { const v = num[i].charCodeAt() - '0'.charCodeAt(); if ((h.get(i) || 0) !== v) { returnfalse; } } returntrue; };
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12
funcdigitCount(num string)bool { cnt := map[rune]int{} for _, c := range num { cnt[c-'0']++ } for i, c := range num { if cnt[rune(i)] != int(c-'0') { returnfalse } } returntrue }