thảo luận Leetcode mỗi ngày

  • Người tạo chủ đề Người tạo chủ đề _Gia_Cat_Luong_
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
tui đang đọc thứ ma thuật gì đây :surrender:
bài dễ mới dám múa thôi
CwKLdbR.png
 
Java:
class Solution {
    public static final int BASE = 31;
    public static final int MOD = 1_000_000_007;
    public boolean rotateString(String s, String goal) {
        if (s.length() != goal.length()) return false;

        long curHash = getHash(s);
        long targetHash = getHash(goal);
        
        if (curHash == targetHash) return true;

        long maxPow = 1;
        for (int i = 1; i < s.length(); i++) {
            maxPow *= BASE;
            maxPow %= MOD;
        }

        for (int i = 0; i < s.length(); i++) {
            curHash -= ((maxPow * (s.charAt(i) - 'a' + 1)) % MOD);
            curHash += MOD;
            curHash %= MOD;
            curHash *= BASE;
            curHash %= MOD;
            curHash += (s.charAt(i) - 'a' + 1);

            if (curHash == targetHash) return true;
        }

        return false;
    }

    public long getHash(String str) {
        long hash = 0;
        for (char c : str.toCharArray()) {
            hash *= BASE;
            hash += (c - 'a' + 1);
            hash %= MOD;
        }

        return hash;
    }
}
 
Python:
class Solution:
    def compressedString(self, word: str) -> str:
        result = []
        curr, count, n = word[0], 1, len(word)
        for i in range(1, n):
            if curr != word[i]:
                result.append(str(count) + curr)
                curr, count = word[i], 1
                continue
            if count == 9:
                result.append('9' + curr)
                count = 1
                continue
            count += 1
        if count > 0:
            result.append(str(count) + curr)
        return ''.join(result)
 
C++:
class Solution {
public:
    string compressedString(string word) {
        stringstream ss;
        size_t pos = 0;
        size_t i;
        while (pos < word.length()) {
            for (i = pos + 1; i - pos < 9 && i < word.length(); ++i) {
                if (word[pos] != word[i])
                    break;
            }
            ss << (i - pos) << word[pos];
            pos = i;
        }
        return ss.str();
    }
};
 
Python:
class Solution:
    def compressedString(self, word: str) -> str:
        ans = ""
        count = 1
        def generateWord(count, char):
            group = count//9
            remainder = count%9
            ans = str("9" + char)*group
            if remainder != 0:
                ans += str(remainder) + char
            return ans
        
        for i in range(1, len(word)):
            if word[i] == word[i - 1]:
                count += 1
            else:
                ans += generateWord(count, word[i - 1])
                count = 1
        
        ans += generateWord(count, word[-1])
        return ans
 
PHP:
class Solution {

    /**
     * @param String $word
     * @return String
     */
    function compressedString($word) {
        $max = 9;
        $ans = '';
       $count = 0;
       
        for ($i=0; $i<strlen($word); $i++) {
            if ($count === 0) {
                $count++;
                $pre = $word[$i];
                continue;
            }

            if ($word[$i] != $pre) {
                $ans .= $count . $pre;
                $pre = $word[$i];
                $count = 1;
                continue;
            }

            $count++;
            if ($count == $max) {
                $ans .= $count . $pre;
                $count = 0;
            }
        }

        $ans .= ($count > 0) ? $count . $pre : '';
        return $ans;
    }
}
 
Java:
class Solution {
    public String compressedString(String word) {
        if (word.isEmpty())
            return word;

        char last = word.charAt(0);
        char c;
        int count = 0;
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < word.length(); i++) {
            c = word.charAt(i);
            if (c == last && count < 9) {
                count++;
            }
            else {
                sb.append(count);
                sb.append(last);
                last = c;
                count = 1;
            }
        }

        sb.append(count);
        sb.append(last);

        return sb.toString();
    }
}

Python:
class Solution:
    def compressedString(self, word: str) -> str:
        if not word:
            return word

        last = word[0]
        count = 0
        result = []

        for c in word:
            if c == last and count < 9:
                count += 1
            else:
                result.append(str(count))
                result.append(last)
                last = c
                count = 1

        result.append(str(count))
        result.append(last)

        return ''.join(result)
 
Java:
class Solution {
    public String compressedString(String word) {

        StringBuilder sb = new StringBuilder();
        char last = word.charAt(0);
        int cnt = 1;
        for (int i = 1; i < word.length(); i++) {
            if (word.charAt(i) == last) {
                cnt++;
                continue;
            } else {
                while (cnt > 0) {
                    int re = Math.min(cnt, 9);
                    sb.append(re);
                    sb.append(last);
                    cnt -= re;
                }
                cnt = 1;
                last = word.charAt(i);
            }
        }
        while (cnt > 0) {
            int re = Math.min(cnt, 9);
            sb.append(re);
            sb.append(last);
            cnt -= re;
        }
        return sb.toString();
    }
}
 
Java:
    public String compressedString(String word) {
        int n = word.length();
        int count = 0;
        StringBuilder ans = new StringBuilder();
        for(int i = 0; i < n; i++) {
            count++;
            if(i+1 == n || word.charAt(i) != word.charAt(i + 1) || count == 9) {
                ans.append(count);
                ans.append(word.charAt(i));
                count = 0;
            }
        }
        return ans.toString();
    }
 
Swift:
class Solution {
    func compressedString(_ word: String) -> String {
        var result:[Character] = []
        let word = [Character](word)
        var char = word[0]
        var count = 0
        func addChar() {
            guard count > 0 else { return }
            result.append(Character("\(count)"))
            result.append(char)
        }
        for c in word {
            if c == char {
                count += 1
                if count == 9 {
                    addChar()
                    count = 0
                }
            } else {
                addChar()
                char = c
                count = 1
            }
        }
        addChar()
        return String(result)
    }
}
 
Java:
class Solution {
    public String compressedString(String word) {
        StringBuilder comp = new StringBuilder();
        for (int l = 0, r = 0; r < word.length(); r++) {
            if (r - l == 9) {
                comp.append("9").append(word.charAt(l));
                l = r;
            }
            if (word.charAt(l) != word.charAt(r)) {
                comp.append(r - l).append(word.charAt(l));
                l = r;
            }
            if (r == word.length() - 1) {
                comp.append(r - l + 1).append(word.charAt(l));
            }
        }
        return comp.toString();
    }
}
Python:
class Solution:
    def compressedString(self, word: str) -> str:
        comp = ""
        l = 0
        r = 0
        for r in range(len(word)):
            if r - l == 9:
                comp += "9" + word[l]
                l = r
            if word[l] != word[r]:
                comp += str(r - l) + word[l]
                l = r
            if r == len(word) - 1:
                comp += str(r - l + 1) + word[l]
        return comp
 
Sửa lần cuối:
Submit rồi mới biết bài hn trước có làm rồi, mỗi lần làm 1 cách khác nhau @@
 
Bài hôm nay medium easy, nên đủ sức làm mà khoe cũng cũng có mác hơn

Python:
class Solution:
    def compressedString(self, word: str) -> str:
        stats = []
        idx = 0
        while idx < len(word):
            c = word[idx]
            start_idx = idx + 1
            while start_idx < len(word) and word[start_idx] == c:
                start_idx += 1
            stats.append((c, start_idx - idx))
            idx = start_idx
        print(stats)
        res = []
        for (key, val) in stats:
            print(key, val)
            if val >= 9:
                res.extend([f"9{key}"] * (val // 9))
            if val % 9 != 0:
                res.append(f"{val % 9}{key}")
        return "".join(res)
 
Python:
class Solution:
    def compressedString(self, word: str) -> str:
        curr = word[0]
        count = 0
        res = ""
        word += "!" # A dummy char used to ensure the loop executes 1 additional iteration

        for c in word:
            if c == curr:
                count += 1
            else:
                while count >= 9:
                    count -= 9
                    res += "9" + curr
                if count != 0:
                    res += str(count) + curr

                curr = c
                count = 1

        return res
 
JavaScript:
var compressedString = function (word) {
    return word.replaceAll(/(.)\1{0,8}/g, s => `${s.length}${s[0]}`);
};
 
C-like:
impl Solution {
    pub fn compressed_string(word: String) -> String {
        let (mut word, mut cword) = (word.as_bytes().iter(), Vec::new());
        let (mut rep, mut c) = (1, word.next().copied().unwrap());

        while let Some(&next_c) = word.next() {
            if rep == 9 || c != next_c {
                cword.push(b'0' + rep); cword.push(c);
                c = next_c; rep = 1;
            } else {
                rep += 1;
            }
        }
        cword.push(b'0' + rep); cword.push(c);
        unsafe { String::from_utf8_unchecked(cword) }
    }
}
 
Java:
class Solution {
    public String compressedString(String word) {
        StringBuilder sb = new StringBuilder();
        char pre = word.charAt(0);
        int count = 0;
        for(char c:word.toCharArray()){
            if(c==pre && count<9)
                count++;
            else {
                sb.append(count).append(pre);
                count = 1;
            }
            pre = c;
        }
        sb.append(count).append(pre);
        return sb.toString();
    }
}
 
Python:
class Solution:
    def compressedString(self, word: str) -> str:
        ans = ""
        count = 1
        def generateWord(count, char):
            group = count//9
            remainder = count%9
            ans = str("9" + char)*group
            if remainder != 0:
                ans += str(remainder) + char
            return ans
  
        for i in range(1, len(word)):
            if word[i] == word[i - 1]:
                count += 1
            else:
                ans += generateWord(count, word[i - 1])
                count = 1
  
        ans += generateWord(count, word[-1])
        return ans
code của bác bị chậm rồi, các đoạn dụng ans += là cộng string nó không như append của array nên độ phức tạp sẽ là O(len ans), e vừa check nhưng ko hiểu sao cách làm của e vẫn bị chậm hơn bọn nó, khác nhau mỗi việc ko dùng curr, mà của e dùng bằng access word cũng là O(1) mà, thậm chí bọn nó còn dùng word[1:] cost O(N) mà e dùng len(word) O(1) vẫn thua.

Python:
class Solution:
    def compressedString(self, word: str) -> str:
        count = 1
        ans = []
        curr = word[0]

        for c in word[1:]:
            if c == curr:
                count += 1
                if count == 10:
                    ans.append(str("9"))
                    ans.append(c)
                    count = 1
            else:
                ans.append(str(count))
                ans.append(curr)
                curr = c
                count = 1
      
        ans.append(str(count))
        ans.append(curr)
      
        return "".join(ans)

Python:
class Solution:
    def compressedString(self, word: str) -> str:
        count = 1
        ans = []
        for i in range(1, len(word)):
            if word[i] == word[i-1]:
                count += 1
                if count == 10:
                    ans.append(str("9"))
                    ans.append(word[i])
                    count = 1
            else:
                ans.append(str(count))
                ans.append(word[i-1])
                count = 1
        
        ans.append(str(count))
        ans.append(word[-1])
        
        return "".join(ans)
 
Sửa lần cuối:
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
_Gia_Cat_Luong_,
Người trả lời cuối
Vipluckystar,
Trả lời
17.755
Lượt xem
1.213.602
Quay lại
Lên đầu trang