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.
Python:
class Solution:
    def largestNumber(self, A: List[int]) -> str:
        def compare(a, b):
            if a == b:
                return 0
            if str(a) + str(b) > str(b) + str(a):
                return -1
            else:
                return 1
        
        A = sorted(A,key=cmp_to_key(compare))
        b = "".join(map(str,A))
        return "0" if b[0] == '0' else b
 
Java:
class Solution {
    public String largestNumber(int[] nums) {
        String[] arr = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            arr[i] = String.valueOf(nums[i]);
        }
        Arrays.sort(arr, (String a, String b) -> {
            int m = a.length();
            int n = b.length();
            int i = 0;
            int j = 0;
            if (m % n == 0 || n % m == 0) {
                while (i < m || j < n) {
                    if (a.charAt(i % m) > b.charAt(j % n))
                        return -1;
                    else if (a.charAt(i % m) < b.charAt(j % n))
                        return 1;
                    i++;
                    j++;
                }
            }
            else{
                while (true) {
                    if (a.charAt(i % m) > b.charAt(j % n))
                        return -1;
                    else if (a.charAt(i % m) < b.charAt(j % n))
                        return 1;
                    i++;
                    j++;
                }
            }
            return 0;
        });
        StringBuilder sb = new StringBuilder();
    
        for (String num:arr) {
            sb.append(num);
        }
        return sb.charAt(0) == '0' ? "0" : sb.toString();
    }
}
làm hơi loằng ngoằng tí nhưng beat 99%
Y9XGQJi.png
Đang lười mà bác mao đăng ntn nên em nghĩ chắc nay em bỏ quá :D
 
Java:
class Solution {
    public String largestNumber(int[] nums) {
        String[] arr = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            arr[i] = String.valueOf(nums[i]);
        }
        Arrays.sort(arr, (String a, String b) -> {
            int m = a.length();
            int n = b.length();
            int i = 0;
            int j = 0;
            if (m % n == 0 || n % m == 0) {
                while (i < m || j < n) {
                    if (a.charAt(i % m) > b.charAt(j % n))
                        return -1;
                    else if (a.charAt(i % m) < b.charAt(j % n))
                        return 1;
                    i++;
                    j++;
                }
            }
            else{
                while (true) {
                    if (a.charAt(i % m) > b.charAt(j % n))
                        return -1;
                    else if (a.charAt(i % m) < b.charAt(j % n))
                        return 1;
                    i++;
                    j++;
                }
            }
            return 0;
        });
        StringBuilder sb = new StringBuilder();
    
        for (String num:arr) {
            sb.append(num);
        }
        return sb.charAt(0) == '0' ? "0" : sb.toString();
    }
}
làm hơi loằng ngoằng tí nhưng beat 99%
Y9XGQJi.png
sol hay quá thím
 
Java:
class Solution {
    public String largestNumber(int[] nums) {
        String ans = Arrays.stream(nums)
                            .mapToObj(String::valueOf)
                            .sorted((a, b) -> (b + a).compareTo(a + b))
                            .collect(Collectors.joining());

        return ans.charAt(0) == '0' ? "0" : ans;
    }
}
 
Bài nay mà AC thấp nhỉ
Python:
class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        def comparator(s1, s2):
            return int(s2 + s1) - (int)(s1 + s2)
     
        nums = [str(num) for num in nums]
        nums = sorted(nums, key = cmp_to_key(comparator))
        ans = '0' if nums[0] == '0' else ''.join(nums)
        return ans

Sao ko sort luôn mà xài buble sort thế fence
=)) quên mất cách viết custom sort, nên t code sort cho lẹ luôn. n = 100 thôi mà
 
Java:
class Solution {
    public String largestNumber(int[] nums) {
        String[] arr = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            arr[i] = String.valueOf(nums[i]);
        }
        Arrays.sort(arr, (String a, String b) -> {
            int m = a.length();
            int n = b.length();
            int i = 0;
            int j = 0;
            if (m % n == 0 || n % m == 0) {
                while (i < m || j < n) {
                    if (a.charAt(i % m) > b.charAt(j % n))
                        return -1;
                    else if (a.charAt(i % m) < b.charAt(j % n))
                        return 1;
                    i++;
                    j++;
                }
            }
            else{
                while (true) {
                    if (a.charAt(i % m) > b.charAt(j % n))
                        return -1;
                    else if (a.charAt(i % m) < b.charAt(j % n))
                        return 1;
                    i++;
                    j++;
                }
            }
            return 0;
        });
        StringBuilder sb = new StringBuilder();
    
        for (String num:arr) {
            sb.append(num);
        }
        return sb.charAt(0) == '0' ? "0" : sb.toString();
    }
}
làm hơi loằng ngoằng tí nhưng beat 99%
Y9XGQJi.png

Hàm sort này compare "11" với "111" sao nhỉ?
 
Hàm sort này compare "11" với "111" sao nhỉ?
oẳng
TVa4IRz.png

mới chôm dc cái hàm sort qua dc case này
Java:
Arrays.sort(arr, (a, b) -> {
    int m = a.length();
    int n = b.length();
    int i = 0;
    while (i==0 || i%m !=0 || i%n !=0) {
        if (a.charAt(i % m) > b.charAt(i % n))
            return -1;
        else if (a.charAt(i % m) < b.charAt(i % n))
            return 1;
        i++;
    }
    return 0;
});
 
Sửa lần cuối:
hard pha ke, :ah:
dùng bfs, state là tọa độ + với tập keys đang cầm.
chuẩn men rồi, hard pha kè thôi :beauty:
29/06:
Cách dưới đây cũng dùng bfs, state = (x,y,keys). Nhưng chỉ cần 1 số int để lưu state. Do m, n < 30 nên chỉ cần 1 byte để lưu tọa độ x, 1 byte tọa độ y. Số lượng key <= 6 nên cũng chỉ cần 1 byte => 1 số int là đủ.

C++:
class Solution {
public:
    int shortestPathAllKeys(vector<string>& grid) {
        int keys = accumulate(grid.begin(), grid.end(), 0, [] (auto acc, auto &s) {
            return acc + accumulate(s.begin(), s.end(), 0, [] (auto acc, auto &c) {
                return islower(c) ? acc | (1 << (c - 'a')) : acc;
            });
        });
        auto [start_i, start_j] = getStart(grid);
        int init_state = getNextState(0, start_i, start_j);
        unordered_set<int> visited = {init_state};
        vector<int> q = {init_state};
        int ret = 0;
        while (!q.empty()) {
            vector<int> tmp_q;
            ret += 1;
            for (auto state : q) {
                int adj[][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}};
                auto [x, y] = getPos(state);
                for (auto [m, n] : adj) {
                    int i = x + m;
                    int j = y + n;
                    if (i < 0 || i >= grid.size() || j < 0 || j >= grid[0].length() || grid[i][j] == '#') continue;
                    if (isupper(grid[i][j]) && !hasKey(state, grid[i][j])) continue;
                    int next_state = getNextState(state, i, j);
                    if (islower(grid[i][j]) && !hasKey(next_state, grid[i][j])) {
                        next_state = getNextState(next_state, grid[i][j]);
                        if (keys == getKey(next_state)) return ret;
                    }
                    if (visited.count(next_state)) {
                        continue;
                    }
                    visited.insert(next_state);
                    tmp_q.push_back(next_state);
                }
            }
            q.swap(tmp_q);
        }
        return -1;
    }

    pair<int, int> getStart(vector<string>& grid) {
        for (int i = 0; i < grid.size(); ++i) {
            for (int j = 0; j < grid[0].length(); ++j) {
                if (grid[i][j] == '@') return {i, j};
            }
        }
        return {};
    }

    int getNextState(int state, int i, int j) {
        return (i << 16) | (j << 8) | (0xff & state);
    }

    int getNextState(int state, char key) {
        return state | (1 << (key - 'a'));
    }

    pair<int, int> getPos(int state) {
        return {state >> 16, (state & 0xff00) >> 8};
    }

    int getKey(int state) {
        return state & 0xff;
    }

    bool hasKey(int state, char lock) {
        return state & (1 << (tolower(lock) - 'a'));
    }
};
 
Python:
class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        def is_swap(a: int, b: int):
            sa, sb = str(a), str(b)
            return int(sb + sa) - int(sa + sb)

        nums.sort(key=cmp_to_key(is_swap))

        return str(int("".join(map(str, nums))))
 
Vozer nay tự chuyển biến r, giải 1 line, chê hard dễ :oh:
Chắc bác mao âm thầm phát course udemy trừ em ra r :choler:
 
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.215.683
Quay lại
Lên đầu trang