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.
xài exp() và log() ko đây
C++:
    bool isPowerOfThree(int n) {
        if (n < 1) return false;
        int b = static_cast<int>(0.5 + log(n) / log(3));
        return static_cast<unsigned int>(0.5 + exp(b * log(3))) == n;
    }
bị dính cái test 2147483647 nên cái chót phải cast thành unsigned
g8XXj8u.gif
 
trong cái thớt SO kia có câu chả lời kìa https://stackoverflow.com/a/16309631
kH9BFd2.gif



ơ nó bảo ko nhanh bằng tìm kiếm như cái n in (3^0, 3^1, ...) nhưng tìm lẹ O(1) bằng cách xài vị trí bit 1 cao nhứt làm index trong mảng 3^i
ghXpJrI.png
ghXpJrI.png
ghXpJrI.png

Gọi là O(1) nhưng thực chất là O(log log n)

Cách tìm trong list thì phải chèn 0 vào giữa.
Nên kết hợp với trò chia cho log2(3) để list compact hơn.

C++:
constexpr std::array<int, 20> power = {1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467};

constexpr float lg23 = 1.5849625007211563;

class Solution {
public:
    bool isPowerOfThree(int n) {
        if (n <= 0) return false;
        int lg2 = sizeof(n)*8 - 1 - __builtin_clz(n);
        int lg3 = std::ceil(lg2 / lg23);
        
        return power[lg3] == n;
    }
};
 
3 là số nguyên tố nên 3^x chắc chắn sẽ chia hết cho 3^y với y <= x. Số 1162261467 là số lớn nhất của kiểu int32 có dạng 3^x đó.
khác nào giải bài toán: S = 1 + 2 + 3 + .... + n
thay vì dùng vòng for để mô tả quá trình xử lý của máy tính thì ông lại giải gọn gàng thành:
return n(n + 1)/2;
10 điểm đại số, 1 điểm thuật toán, về chỗ :D
 
khác nào giải bài toán: S = 1 + 2 + 3 + .... + n
thay vì dùng vòng for để mô tả quá trình xử lý của máy tính thì ông lại giải gọn gàng thành:
return n(n + 1)/2;
10 điểm đại số, 1 điểm thuật toán, về chỗ :D

Tôi google "1162261467 power of 3" thôi, chứ tôi dốt toán lắm
M7EYXjT.png
 
Gọi là O(1) nhưng thực chất là O(log log n)

Cách tìm trong list thì phải chèn 0 vào giữa.
Nên kết hợp với trò chia cho log2(3) để list compact hơn.

C++:
constexpr std::array<int, 20> power = {1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467};

constexpr float lg23 = 1.5849625007211563;

class Solution {
public:
    bool isPowerOfThree(int n) {
        if (n <= 0) return false;
        int lg2 = sizeof(n)*8 - 1 - __builtin_clz(n);
        int lg3 = std::ceil(lg2 / lg23);
       
        return power[lg3] == n;
    }
};
viết code template cho cái mảng power đi
JEWoIdl.png
viết thế kia là cheat rồi
uq1dgnk.png
 
Python:
class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        
        ransomNote_count = defaultdict(int)
        for i in ransomNote:
            ransomNote_count[i] += 1
            
        magazine_count = defaultdict(int)
        for i in magazine:
            magazine_count[i] += 1

        
        for i in ransomNote:
            if magazine_count[i] < ransomNote_count[i]:
                return False
        
        return True
 
luyện leetcode nhiều mai đi làm có dùng nhiều ko các fen
Thật ra là không, hoặc rất ít... trừ khi bạn làm R&D, phát triển Open Source, làm nghiên cứu chuyên sâu.
Đa số các developer luyện thuật toán ở đây là muốn luyện để tăng khả năng xử lý vấn đề và chủ yếu là để có lợi thế hơn khi đi interview, vì các nhà tuyển dụng ngoài phỏng vấn công nghệ thì sẽ thêm vài câu thuật toán vào để đánh giá trình độ của ứng viên.
 
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.212.693
Quay lại
Lên đầu trang