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.
tận dụng được chứ, copy cái layer ví dụ phải gán 100 phần tử thì tốn kém hơn là move 1 pointer với 2 size_t chứ
QwJ0V0V.png
mà phần lớn là phải new 1 cái mảng mới, đã new 1 lần cho cái layer rồi còn phải new 1 lần nữa cho cái mảng trong result thì hơi phí. Move thẳng cái layer vào result luôn khỏi cần new 1 mảng mới làm gì.

mấy tay dev C++ keo kiệt bần tiện lắm
JiZo9zf.png
giảm được new phát nào thì phải giảm phát đó
Chỗ move bác kân nói chuẩn mà. T có ý kiến gì chỗ đó đâu.
T chỉ nói cái emplace_back thôi. Dùng cái đó để tận dụng in-place construct. Nhưng code này thì cái layer đã đc tạo bên ngoài rồi nên emplace_back hay push_back cũng thế thôi. Chính vì nó đã được tạo ra bên ngoài nên mới phải move đó
 
em cảm ơn bác, hồi đó em xem cha cherno bảo dùng emplace_back để khỏi copy thì em tưởng nó đã bao gồm std::move luôn rồi
mà sao lên đến ver 3 rồi thế này
Sai nhé. Cái emplace thì nó là varidic template, nó sẽ forward args cho constructor để in-place construct thôi.
Ví dụ:
C++:
// Case 1
vector<vector<int>> vec;
vector<int> tmp(100, 1);
vec.push_back(move(tmp));

// Case 2
vec.emplace_back(100, 1);
Thay vì tạo ra ở bên ngoài sau đó move vào thì in-place construct như case 2 luôn.

Kiểm tra thêm constructor của vector.
https://en.cppreference.com/w/cpp/container/vector/vector
Khi chưa xài move thì emplace_back sẽ forward cho thằng constructor số 6 là copy constructor.
Xài move rồi thì emplace_back sẽ forward cho thằng constructor số 8 là move constructor.
 
Bài hôm nay khá nhẹ nhàng. Gặp cây cối thì cứ đệ quy thôi.

C++:
    TreeNode* pruneTree(TreeNode* root) {
        if (root == nullptr) return nullptr;
        root->left = pruneTree(root->left);
        root->right = pruneTree(root->right);
        if (root->left == nullptr && root->right == nullptr && root->val != 1) return nullptr;
        return root;
    }
 
mà sao lên đến ver 3 rồi thế này
hay cà khịa tôn giáo nên bị ban
dzipaLk.gif


T chỉ nói cái emplace_back thôi. Dùng cái đó để tận dụng in-place construct. Nhưng code này thì cái layer đã đc tạo bên ngoài rồi nên emplace_back hay push_back cũng thế thôi. Chính vì nó đã được tạo ra bên ngoài nên mới phải move đó
ờm chắc toy đọc hiểu có vấn đề
OANgL56.png

mới vô coi lại push_back https://en.cppreference.com/w/cpp/container/vector/push_back có quá tải cho T&& thì xài v.push_back(std::move(element)) cũng được nè
ghXpJrI.png



edit: toy có vào cái discord nọ cứ nhắc tới Cherno là nó chửi lên bờ xuống ruộng
rl1Kgfo.gif


edit nữa: bài hôm nay ko ai gọi delete root; ở cái chỗ check if à
aVgiONl.png
mà đề dỏm, ko rõ TreeNode* nó trỏ tới vùng nhớ được cấp phát động hay tĩnh
Dcnffay.png
 
rl1Kgfo.gif


edit nữa: bài hôm nay ko ai gọi delete root; ở cái chỗ check if à
aVgiONl.png
mà đề dỏm, ko rõ TreeNode* nó trỏ tới vùng nhớ được cấp phát động hay tĩnh
Dcnffay.png

Contest thì kệ thôi. Chứ có biết nó được alloc bằng cách gì đâu: new, new[] hay malloc().
 
1 dòng
uq1dgnk.png


C++:
        return root ? root->left = pruneTree(root->left),
                      root->right = pruneTree(root->right),
                      root->val == 0 && !root->left && !root->right ? nullptr : root
                    : nullptr;

C++:
        return root && (
            !(root->left = pruneTree(root->left)) &
            !(root->right = pruneTree(root->right)) &
            (root->val == 0)
        ) ? nullptr : root;
 
Sửa lần cuối:
Đầu tuần đầu tháng nhẹ nhàng
hkNtitg.png


Mã:
defmodule Solution do
  def prune_tree(node) do
    case node do
      nil -> nil

      %TreeNode{val: v, left: l, right: r} ->
        left = prune_tree(l)
        right = prune_tree(r)

        case {v, left, right} do
          {0, nil, nil} -> nil
          {v, left, right} -> %TreeNode{val: v, left: left, right: right}
        end
    end
  end
end
 
1 dòng, chỉ cần 1 lần rẽ nhánh:

C++:
class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        return root ? reinterpret_cast<TreeNode*>(reinterpret_cast<long>(root) &
            ((!(root->left = pruneTree(root->left)) &
              !(root->right = pruneTree(root->right)) &
              !root->val) - 1))
         : nullptr;
    }
};
 
Python:
class Solution:
    def pruneTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root is None: return None
        root.left=self.pruneTree(root.left)
        root.right=self.pruneTree(root.right)
        return None if root.left is None and root.right is None and root.val == 0 else root
 
Dạo này toàn cây cối. Đệ quy thôi cho nhẹ đầu :shame:
Ruby:
def prune_tree(root)
  return if root.nil?
    
  root.left = prune_tree(root.left)
  root.right = prune_tree(root.right)
  return if (root.left.nil? && root.right.nil?) && root.val != 1
  root
end
 
:doubt: mọe hôm qua dễ quá bảo tối về làm mà ngủ quên cmnl :beat_brick: lại tốn mất 70 coin mua vé làm bù cả hôm qua lẫn hôm nay
1BW9Wj4.png
mà toàn Tree, có khi nào ngày mai nó cho bài HARD rào cây gì không?
osCpCsi.png



Mà voz bị lỗi cc gì thế này, không post code được
Xv0BtTR.png
 
Cơ bản thì bài hôm nay hơi dễ để xếp vào medium và hơi khó để xếp vào easy. :)
 
6l22n1x.png
mà nói thẳng nhé, 2022 rồi mà còn dính lỗi SQL Injection, tôi khuyên là tủ đông lạnh nên bán voz
 
Lại cây cối, em thấy làm cũng ổn mà ko hiểu sao ăn mem vs chạy hơi lâu :sad:

Mã:
string tree2str(TreeNode* root) {
        if (root == nullptr) return "";
        string out = to_string(root->val);
        if (root->left || root->right) {
            out += "(" + tree2str(root->left) + ")";
            if (root->right)
                out += "(" + tree2str(root->right) + ")";
        }
        return out;
    }
 
do thằng leetcode nó tính mem + đo thời gian ko chính xác thoy. Có lẽ 1 code đo mem/thời gian cho tất cả các ngôn ngữ nên ko chính xác. Bài nào chạy lẹ thời gian tính bằng vài ms thì lại càng ko chính xác nữa
LTT2cUR.png
 
Lại cây cối, em thấy làm cũng ổn mà ko hiểu sao ăn mem vs chạy hơi lâu :sad:

Mã:
string tree2str(TreeNode* root) {
        if (root == nullptr) return "";
        string out = to_string(root->val);
        if (root->left || root->right) {
            out += "(" + tree2str(root->left) + ")";
            if (root->right)
                out += "(" + tree2str(root->right) + ")";
        }
        return out;
    }
Do tạo string mới, allocate mem liên tục đó, nghĩ cách nào chỉ tạo string với allocate 1 lần thôi, :p
 
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.777
Quay lại
Lên đầu trang