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 mà dài thế?

C++:
class Solution {
public:
    vector<int> sumEvenAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
        vector<int> res; res.reserve(queries.size());
        int sum = 0;
        for (auto i : nums) sum += i & ((i & 1) - 1);
        for (auto &v : queries) {
            auto &n = nums[v[1]];
            sum -= n & ((n & 1) - 1);
            n += v[0];
            res.emplace_back(sum += n & ((n & 1) - 1));
        }
        return res;
    }
};
dân chơi là xài 1 hàm thoy
JiZo9zf.png


C++:
struct Solution {
    vector<int> sumEvenAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
        vector<int> res(queries.size());
        transform(begin(queries), end(queries), begin(res),
                  [&, sum = accumulate(begin(nums), end(nums), 0, [](int sum, int n) {
                          return sum + (n & ((n & 1) - 1));
                      })](const auto& q) mutable {
                      auto& n = nums[q[1]];
                      sum -= n & ((n & 1) - 1);
                      n += q[0];
                      return sum += n & ((n & 1) - 1);
                  });
        return res;
    }
};
 
dân chơi là xài 1 hàm thoy
JiZo9zf.png


C++:
struct Solution {
    vector<int> sumEvenAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
        vector<int> res(queries.size());
        transform(begin(queries), end(queries), begin(res),
                  [&, sum = accumulate(begin(nums), end(nums), 0, [](int sum, int n) {
                          return sum + (n & ((n & 1) - 1));
                      })](const auto& q) mutable {
                      auto& n = nums[q[1]];
                      sum -= n & ((n & 1) - 1);
                      n += q[0];
                      return sum += n & ((n & 1) - 1);
                  });
        return res;
    }
};
Làm chi phức tạp vậy bác kân, 1 dòng là đủ rồi :p

C++:
        return accumulate(queries.begin(), queries.end(), vector<int>(queries.size()), 
                  [&nums, i = 0, sum = accumulate(nums.begin(), nums.end(), 0, 
                                                  [](auto acc, auto x) {
                                                      return acc + (x & ((x & 1)-1));
                                                  })] (auto &acc, auto &x) mutable {
                            sum -= nums[x[1]] & ((nums[x[1]] & 1) - 1);
                            nums[x[1]] += x[0];
                            sum += nums[x[1]] & ((nums[x[1]] & 1) - 1);
                            acc[i++] = sum;
                            return move(acc);
                        });
 
Sửa lần cuối:
Làm chi phức tạp vậy bác kân, 1 dòng là đủ rồi :p

C++:
        return accumulate(queries.begin(), queries.end(), vector<int>(queries.size()), 
                  [&nums, i = 0, sum = accumulate(nums.begin(), nums.end(), 0, 
                                                  [](auto acc, auto x) {
                                                      return acc + (x & ((x & 1)-1));
                                                  })] (auto &acc, auto &x) mutable {
                            sum -= nums[x[1]] & ((nums[x[1]] & 1) - 1);
                            nums[x[1]] += x[0];
                            sum += nums[x[1]] & ((nums[x[1]] & 1) - 1);
                            acc[i++] = sum;
                            return move(acc);
                        });
nick cùi bắp ko like được
OANgL56.png
OANgL56.png
OANgL56.png
 
Bác hash 1 string thì dù gì hash function cũng phải duyệt qua cả string đó rồi mới gen ra được một số nên ko phải O(nm). Vd như hash("a") với hash("aaaaaaaa") thì thời gian ko giống nhau đâu.
Bác đọc trong này có ví dụ về 1 hàm polynomial rolling hash này
https://cp-algorithms.com/string/string-hashing.html
Ồ hiểu rồi thank you 2 fen nhiều nha
1663810818638.png



cái code cũ hôm chủ nhật nó vẫn cho pass nè fen, ảo thiệt đó, tự nhiên sáng nay thấy nó update giải đc 4 bài lun :byebye:

1663810923725.png
 
C#:
public class Solution {
    public string ReverseWords(string s) {
        List<string> result = new List<string>();
        string[] arr = { s };

        if (s.Contains(" "))
            arr = s.Split(" ");

        foreach (string aWord in arr)
        {
            char[] charArray = aWord.ToCharArray();
            Array.Reverse(charArray);
            result.Add(new string(charArray));
        }
        return string.Join(" ", result);
    }
}
 
soilzx9.png
thằng Java không có methods reverse cho string, cũng không có reverse substring cho StringBuilder nhỉ?

Java:
class Solution {
    public String reverseWords(String s) {
        if(s.length() == 0)
        {
            return s;
        }
        StringBuilder ans = new StringBuilder(s);
        StringBuilder tmp = new StringBuilder();
        int j = 0;
        for(int i = 0; i < ans.length(); i++)
        {
            if(ans.charAt(i) != ' ')
            {
                continue;
            }
            tmp.append(ans.substring(j, i)).reverse();
            ans.replace(j, i, tmp.toString());
            tmp.delete(0, tmp.length());
            j = i + 1;
        }
        tmp.append(ans.substring(j, ans.length())).reverse();
        ans.replace(j, ans.length(), tmp.toString());
        tmp.delete(0, tmp.length());
        return ans.toString();
    }
}
 
soilzx9.png
thằng Java không có methods reverse cho string, cũng không có reverse substring cho StringBuilder nhỉ?

Java:
class Solution {
    public String reverseWords(String s) {
        if(s.length() == 0)
        {
            return s;
        }
        StringBuilder ans = new StringBuilder(s);
        StringBuilder tmp = new StringBuilder();
        int j = 0;
        for(int i = 0; i < ans.length(); i++)
        {
            if(ans.charAt(i) != ' ')
            {
                continue;
            }
            tmp.append(ans.substring(j, i)).reverse();
            ans.replace(j, i, tmp.toString());
            tmp.delete(0, tmp.length());
            j = i + 1;
        }
        tmp.append(ans.substring(j, ans.length())).reverse();
        ans.replace(j, ans.length(), tmp.toString());
        tmp.delete(0, tmp.length());
        return ans.toString();
    }
}
sao lại không
PHP:
class Solution {
    public String reverseWords(String s) {
        String[] words = s.split(" ");
        
        for (int i = 0; i < words.length; i++) {
            words[i] = new StringBuilder(words[i]).reverse().toString();
        }
        
        return String.join(" ", words);
    }
}
 
Mã:
object Solution {
    def reverseWords(s: String): String = {
        s split ' ' map (_.reverse) mkString " "
    }
}
 
Thấy bài dễ là phải nhoi lên ngay. =]]
Python:
return ' '.join([w[::-1] for w in s.split()])
Em cũng python mà dài vch :")) có khoá nào học để viết code gọn lại không thím.
Python:
class Solution:
    def reverseWords(self, s: str) -> str:
        a=s.split()
        ans=""
        for i in range(len(a)):
            a[i]=a[i][::-1]
            if (i<len(a)-1):
                ans+=a[i]+" ";
            else:
                ans+=a[i]
        return ans
 
1 dòng C++
MjfezZB.png

C++:
struct Solution {
    string reverseWords(string s) {
        return [&] { for (auto it = begin(s), jt = begin(s); reverse(it, jt = find(it, end(s), ' ')), jt != end(s);) it = jt + 1; }(), s;
    }
};
 
Mã:
func reverseWords(s string) string {
    arrayS := make([]string, 0)
    arrayS = strings.Split(s, " ")
    for index, value := range arrayS {
        arrayS[index] = reverseWord(strings.Split(value, ""))
    }
    return strings.Join(arrayS, " ")
}

func reverseWord(s []string) string {
    left, right := 0, len(s) - 1
    for left < right {
        temp := s[right]
        s[right] = s[left]
        s[left] = temp
        left++
        right--
    }
    return strings.Join(s, "")
}
Đoạn reverse thì dùng two pointer
 
Em cũng python mà dài vch :")) có khoá nào học để viết code gọn lại không thím.
Python:
class Solution:
    def reverseWords(self, s: str) -> str:
        a=s.split()
        ans=""
        for i in range(len(a)):
            a[i]=a[i][::-1]
            if (i<len(a)-1):
                ans+=a[i]+" ";
            else:
                ans+=a[i]
        return ans
Thôi cứ viết dài đi cho dễ đọc.
Mình code dưỡng sinh nghịch ngợm thì mới thế thôi. :)
https://github.com/dangsonbk/1linePython
 
bài hôm nay khó thặc, search oeis mới ra được 1 dòng
JiZo9zf.png


C++:
struct Solution {
    int concatenatedBinary(int n) {
        return n == 1 ? 1 : (concatenatedBinary(n - 1) * (1ULL << (1 + static_cast<int>(log2(n)))) + n) % 1'000'000'007;
    }
};
 
Thuật toán O(log^2 n). Nguyên tắc cơ bản là dựa vào việc có thể tính nhanh tổng dãy cấp số nhân 2^k phần tử.
Có ai rảnh thử code xem:


Xét nửa khoảng từ [2^k, 2^(k+1) ), ta thấy tất cả số j trong này đều có k bit trong biểu diễn nhị phân. Như vậy khi ghép lại có thể tách làm 2 phân so le k bit như sau (i = 2^k)

s(0) = i 0^k (i+2) 0^k ... i+2^k-2 0^k
s(1) = 0^k (i+1) 0^k i+3 ... 0^k i+2^k-1

Để ý thấy các thành phần tương ứng trong 2 nửa chỉ sai khác nhau 1. Tức là có thể tính một nửa dựa trên nửa còn lại:

s(0) = 2^k * [ s(1) - 1 - 2^2k - 2^4k - ... - 2^(k*(2^k-2)) ]
= 2^k * [ s(1) - (1 + (4^k) + (4^k)^2 + ... + (4^k)^(2^(k-1)-1) )]
= 2^k * [ s(1) - ((4^k)^(2^(k-1)) - 1) / (4^k - 1)]

Thuật toán sẽ là:
  • Tính riêng tổng cho những đoạn có cùng số bit. Có tất cả log n đoạn,
  • Với mỗi đoạn thì dùng phương pháp chia hai như trên. Đệ quy mất O( k)
 
Sửa lần cuối:
Python:
class Solution:
    def concatenatedBinary(self, n: int) -> int:
        res=0
        M=1000000007
        for i in range(1,n+1,1):
            res = (res << (len(bin(i))-2) | i) % M
        return res
 
0FFPAjM.png
loz Leetcode không import sẵn cho cái Big integer class, làm mình húy hoáy coi sai syntax chỗ nào
9NN5SUy.png

Java:
import java.math.BigInteger;
class Solution {
    public final long mod = (long)(Math.pow(10,9) + 7);
    public int concatenatedBinary(int n) {
        if(n <= 0)
        {
            throw new IllegalArgumentException();
        }
        if(n == 1)
        {
            return 1;
        }
        long ans = 1;
        for(int i = 2; i <= n; i++)
        {
            long currentBitLength = (long)(BigInteger.valueOf(i).bitLength());
            ans = ((ans << currentBitLength) % mod + i) % mod;
        }
        return (int)ans;
    }
}
 
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.784
Quay lại
Lên đầu trang