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.
hôm qua ngồi copy thử description của một vài bài đã làm rồi vào ChatGPT, có vẻ mặc định output nó ra python, kết quả có mấy dòng "example usage" giống y hệt như submission của thánh nhân nào hôm bữa trong weekly contest #402 :sweat:

nhìn sơ thì output có vẻ giống editorial của LC

trước giờ không xài, không rõ mấy công ty pv algo có lọc được mấy vụ này không, chứ đi pv mà gặp thánh nhân nào cheat nv thì pv algo thực sự vô nghĩa

biết vậy mấy lần pv mình cheat mẹ nó cho rồi :shame:, pv algo thì lọc được cái con mẹ gì
mình thấy chatgpt chưa đủ trình để giải mấy bài leetcode từ medium trở lên đâu
 
mình thấy chatgpt chưa đủ trình để giải mấy bài leetcode từ medium trở lên đâu

hmm:


chỉ cần công ty nào xài 1) đề có sẵn 2) con bot được train trên solution chính thống và 3) con bot nhả ra output gần giống với data train, đủ để copy-paste rồi chỉ cần chỉnh là có thể dùng bot cheat rồi
 
Mất mặt java quá :angry: Lần sau có đọc/cop thì nhớ ra vẻ ta đây tự làm nhé :canny:
xin thề tuần này mà mở tab sol lên 1 lần nữa tự phạt im lặng 1 tuần. gọi thằng e
bKev1qu.png
@LaceySheaVuong vào hầu hạ các anh
 
Python:
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def getDirections(self, root: Optional[TreeNode], startValue: int, destValue: int) -> str:
        parent_dict = dict()
        node_dict = dict()
        def dfs(p: TreeNode, node: TreeNode):
            if not node:
                return
            node_dict[node.val] = node
            parent_dict[node.val] = p
            dfs(node, node.left)
            dfs(node, node.right)
        
        def get_height(node: TreeNode):
            h = 0
            while parent_dict[node.val]:
                h += 1
                node = parent_dict[node.val]
            return h
        
        dfs(None, root)
        
        start_node_height = get_height(node_dict[startValue])
        dest_node_height = get_height(node_dict[destValue])

        start_directions = []
        dest_directions = []

        start_node = node_dict[startValue]
        dest_node = node_dict[destValue]

        while start_node_height > dest_node_height:
            start_directions.append("U")
            start_node = parent_dict[start_node.val]
            start_node_height -= 1
        
        while dest_node_height > start_node_height:
            p = parent_dict[dest_node.val]
            if p.left == dest_node:
                dest_directions.append('L')
            else:
                dest_directions.append('R')
            dest_node = p
            dest_node_height -= 1
        
        while start_node != dest_node:
            start_directions.append("U")
            start_node = parent_dict[start_node.val]

            p = parent_dict[dest_node.val]
            if p.left == dest_node:
                dest_directions.append('L')
            else:
                dest_directions.append('R')
            dest_node = p
        return "".join(start_directions + list(reversed(dest_directions)))
 
Store left, right bằng string luôn, khỏi cần array

JavaScript:
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} startValue
 * @param {number} destValue
 * @return {string}
 */
var getDirections = function (root, startValue, destValue) {
    let leftPath = '';
    let rightPath = '';
    function findPathToNode(root, path) {
        if (!root) return;
        if (root.val === startValue) {
            leftPath = path;
        } else if (root.val === destValue) {
            rightPath = path;
        }
        if (leftPath && rightPath) return;
        findPathToNode(root.left, path+'L');
        findPathToNode(root.right, path+'R');
    }
    findPathToNode(root, '');
    let isDiff = false;
    let i = 0;
    while (!isDiff && (i < leftPath.length && i < rightPath.length)) {
        if (!isDiff && leftPath[i] === rightPath[i]) {
            leftPath = leftPath.slice(1);
            rightPath = rightPath.slice(1);
            continue;
        }
        isDiff = true;
        i++;
    }
    return "U".repeat(leftPath.length)+rightPath;
};
 
Sửa lần cuối:
Bài không khó lắm :byebye:
JavaScript:
function delNodes(root: TreeNode | null, to_delete: number[]): Array<TreeNode | null> {
    const q: TreeNode[] = [];
    const res: TreeNode[] = [];
    const arr = new Array(1001).fill(false);
    for (const item of to_delete) arr[item] = true;
    q.push(root);
    while (q.length) {
        const node = q.shift();
        if (node.left) {
            q.push(node.left);
            if (arr[node.left.val]) node.left = null;
        }
        if (node.right) {
            q.push(node.right);
            if (arr[node.right.val]) node.right = null;
        }

        if (arr[node.val]) {
            if (node.left) res.push(node.left);
            if (node.right) res.push(node.right);
        }
    }
    if (!arr[root.val]) res.push(root);
    return res;
};
 
Vừa họp daily vừa tranh thủ giải lc tý :LOL:
Swift:
//Problem: https://leetcode.com/problems/delete-nodes-and-return-forest/
class Solution {
    func delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] {
        var rootAns = [TreeNode?]()
        if let delRoot = delNode(root, to_delete, &rootAns) {
            rootAns.append(delRoot)
        }
        return rootAns
    }
    
    func delNode(_ root: TreeNode?, _ to_delete: [Int], _ listRoot: inout [TreeNode?]) -> TreeNode? {
        guard let root else { return nil }
        
        root.left = delNode(root.left, to_delete, &listRoot)
        root.right = delNode(root.right, to_delete, &listRoot)
        if to_delete.contains(root.val) {
            if root.left != nil { listRoot.append(root.left) }
            if root.right != nil { listRoot.append(root.right) }
            return nil
        }
        return root
    }
}
 
JavaScript:
var delNodes = function(root, to_delete) {
    const delete_set = new Set(to_delete);
    const ans = [];
    const dfs = (node) => {
        if (!node) return node;

        node.left = dfs(node.left);
        node.right = dfs(node.right);

        if (!delete_set.has(node.val)) return node;
        if (node.left) ans.push(node.left);
        if (node.right) ans.push(node.right);
        return null;
    }

    const r = dfs(root);
    if (r) ans.push(r);

    return ans;
};
 
Swift:
class Solution {
    func delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] {
        guard let root else { return []}
        var setDel = Set(to_delete)
       
        var result:[TreeNode] = []
        func dfs(_ node: TreeNode?, deletedParent: Bool) -> Bool { // is node exist
            guard let node else { return false }
            if setDel.remove(node.val) != nil {
                dfs(node.left, deletedParent: true)
                dfs(node.right, deletedParent: true)
                return false
            }
            if !dfs(node.left, deletedParent: false) {
                node.left = nil
            }
            if !dfs(node.right, deletedParent: false) {
                node.right = nil
            }
           
            if deletedParent {
                result.append(node)
            }
            return true
        }
        dfs(root, deletedParent: true)
        return result
    }
}
 
Java:
class Solution {
    public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
        List<TreeNode> forest = new ArrayList();
        Queue<TreeNode> queue = new LinkedList();
        queue.add(root);
        int[] del = new int[1001];
        for (int i : to_delete) {
            del[i] = 1;
        }
        if(del[root.val] != 1) forest.add(root);
        List<TreeNode> nodes = new ArrayList();
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            TreeNode left = node.left;
            TreeNode right = node.right;
            if (left != null) {
                queue.add(left);
                if (del[left.val] == 1) {
                    node.left = null;
                    left=null;
                }
            }
            if (right != null) {
                queue.add(right);
                if (del[right.val] == 1) {
                    node.right = null;
                    right=null;
                }
            }
            if (del[node.val] == 1) {
                if (left != null) {
                    forest.add(left);
                }
                if (right != null) {
                    forest.add(right);
                }
            }
        }
        return forest;
    }
}
 
Sửa lần cuối:
Python:
class Solution:
    def delNodes(self, root: Optional[TreeNode], to_delete: List[int]) -> List[TreeNode]:
        forest = []
        toDeleteSet = set(to_delete)

        def deleteNodes(root):
            if not root:
                return
            root.left = deleteNodes(root.left)
            root.right = deleteNodes(root.right)
            if root.val in toDeleteSet:
                forest.extend(node for node in (root.left, root.right) if node)
                return None
            return root
        
        deleteNodes(root)
        if root.val not in toDeleteSet:
            forest.append(root)
        return forest
 
C-like:
impl Solution {
    pub fn del_nodes(
        root: Option<Rc<RefCell<TreeNode>>>,
        to_delete: Vec<i32>,
    ) -> Vec<Option<Rc<RefCell<TreeNode>>>> {
        fn delete_nodes(
            root: Rc<RefCell<TreeNode>>,
            to_delete: &mut std::collections::HashSet<i32>,
            forest: &mut Vec<Option<Rc<RefCell<TreeNode>>>>,
        ) {
            let mut node = root.as_ref().borrow_mut();
            let should_remove_root = to_delete.contains(&node.val);

            if should_remove_root {
                to_delete.remove(&node.val);
            }

            if let Some(left) = node.left.clone() {
                if to_delete.contains(&left.as_ref().borrow().val) {
                    node.left = None;
                }
                delete_nodes(left, to_delete, forest);
            }

            if let Some(right) = node.right.clone() {
                if to_delete.contains(&right.as_ref().borrow().val) {
                    node.right = None;
                }
                delete_nodes(right, to_delete, forest);
            }

            if should_remove_root {
                if node.left.is_some() {
                    forest.push(node.left.clone())
                }
                if node.right.is_some() {
                    forest.push(node.right.clone())
                }
            }
        }

        if let Some(node) = root {
            let mut to_delete: std::collections::HashSet<_> = to_delete.into_iter().collect();
            let mut forest = if to_delete.contains(&node.as_ref().borrow().val) {
                Vec::new()
            } else {
                vec![Some(node.clone())]
            };
            delete_nodes(node.clone(), &mut to_delete, &mut forest);
            forest
        } else {
            Vec::new()
        }
    }
}

Thấy mọi người code ngắn quá nên code lại.
C-like:
impl Solution {
    pub fn del_nodes(root: Option<Rc<RefCell<TreeNode>>>, to_delete: Vec<i32>) -> Vec<Option<Rc<RefCell<TreeNode>>>> {
        fn delete_nodes(root: Option<Rc<RefCell<TreeNode>>>, to_delete: &std::collections::HashSet<i32>, forest: &mut Vec<Option<Rc<RefCell<TreeNode>>>>) -> Option<Rc<RefCell<TreeNode>>> {
            if let Some(ref node) = root {
                let mut node = node.as_ref().borrow_mut();

                (node.left, node.right) = (
                    delete_nodes(node.left.clone(), to_delete, forest),
                    delete_nodes(node.right.clone(), to_delete, forest),
                );

                if to_delete.contains(&node.val) {
                    if node.left.is_some() {
                        forest.push(node.left.clone());
                    }
                    if node.right.is_some() {
                        forest.push(node.right.clone());
                    }
                    return None
                }
             
                return root.clone()
            }
         
            None
        }

        let (mut to_delete, mut forest) = (to_delete.into_iter().collect(), Vec::new());
        if delete_nodes(root.clone(), &to_delete, &mut forest).is_some() {
            forest.push(root)
        }
        forest
    }
}

Ngắn và nhanh hơn nữa.
C-like:
impl Solution {
    pub fn del_nodes(root: Option<Rc<RefCell<TreeNode>>>, to_delete: Vec<i32>) -> Vec<Option<Rc<RefCell<TreeNode>>>> {
        fn delete_nodes(root: &Option<Rc<RefCell<TreeNode>>>, to_delete: &std::collections::HashSet<i32>, forest: &mut Vec<Option<Rc<RefCell<TreeNode>>>>) -> Option<Rc<RefCell<TreeNode>>> {
            if let Some(node) = root {
                let mut node = node.as_ref().borrow_mut();              

                (node.left, node.right) = (
                    delete_nodes(&node.left, to_delete, forest),
                    delete_nodes(&node.right, to_delete, forest),
                );

                if to_delete.contains(&node.val) {
                    if node.left.is_some() {
                        forest.push(node.left.clone());
                    }
                    if node.right.is_some() {
                        forest.push(node.right.clone());
                    }
                    return None
                }
               
                return root.clone()
            }
           
            None
        }

        let (to_delete, mut forest) = (to_delete.into_iter().collect(), Vec::new());
        if delete_nodes(&root, &to_delete, &mut forest).is_some() {
            forest.push(root)
        }
        forest
    }
}
 
Sửa lần cuối:
JavaScript:
function delNodes(root: TreeNode | null, to_delete: number[]): TreeNode[] {
    const result: TreeNode[] = [];
    const deleteSet = new Set(to_delete);

    function dfs(node: TreeNode | null, isRoot: boolean): TreeNode | null {
        if (!node) return null;

        const isDeleted = deleteSet.has(node.val);

        if (isRoot && !isDeleted) {
            result.push(node);
        }

        node.left = dfs(node.left, isDeleted);
        node.right = dfs(node.right, isDeleted);

        return isDeleted ? null : node;
    }

    dfs(root, true);
    return result;
}
 
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.553
Quay lại
Lên đầu trang