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.
Bài này AC hơi cao hư cấu nhỉ, nhưng mà làm quen bit manipulation cũng không khó lắm
Python:
class Solution:
    def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
        n = len(nums)
        xOr = 0
        for num in nums:
            xOr = xOr ^ num
     
        maxK = 2**maximumBit
        ans = []
        for i in range(n - 1, -1, -1):
            current = 0
            currentK = maxK
            for j in range(32, -1, -1):
                if xOr >> j & 1 == 0 and 1 << j < currentK:
                    currentK -= 1 << j
                    current |= 1 << j

            ans.append(current)
            xOr ^= nums[i]
        return ans

Python:
class Solution:
    def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
        n = len(nums)
        xOr = 0
        for num in nums:
            xOr = xOr ^ num
      
        maxK = (1 << maximumBit) - 1
        ans = [0]*n
        for i in range(n - 1, -1, -1):
            ans[n - i - 1] = maxK ^ xOr
            xOr ^= nums[i]
          
        return ans
=> Đã hiểu lí do, thế mà ko nghĩ ra cách đơn giản thế nghĩ hơi phức tạp
 
Sửa lần cuối:
C++:
vector<int> Solution::getMaximumXor(vector<int>& nums, int maximumBit) {
    int n = 0;
    for (int i = 0; i < nums.size(); ++i) {
        n ^= nums[i];
    }
    vector<int> ans;
    ans.reserve(nums.size());
    int maximized = (1 << maximumBit) - 1;
    for (int i = nums.size() - 1; i >= 0; --i) {
        ans.push_back(n ^ maximized);
        n ^= nums[i];
    }
    return ans;
}
 
chào mọi người, e muốn tham gia làm thì phải làm sao ạ. có cần đấm ai để dễ nói chuyện không
M7EYXjT.png
Thím làm nhiệm vụ sư môn nha, giải 300 bài leetcode rồi quay lại gặp chưởng môn @LmaoSuVuong, ngài sẽ cho thím coupon luyện bí kíp python mật tịch
 

Tệp đính kèm

  • Udemy coupon.png
    Udemy coupon.png
    560,7 KB · Lượt xem: 32
Java:
class Solution {
    public int[] getMaximumXor(int[] nums, int maximumBit) {
        int n = nums.length;
        int[] ans = new int[n];
        int[] res = new int[n];
        int max = (1 << maximumBit) - 1;
        for (int i = 0; i < n; i++) {
            if (i == 0) ans[i] = nums[i];
            else ans[i] = ans[i - 1] ^ nums[i];
        }
        for (int i = ans.length - 1; i >= 0 ; i--) {
            ans[i] ^= max;
        }
        for (int i = ans.length - 1; i >= 0 ; i--) {
            res[n - 1 - i] = ans[i];
        }
        return res;
    }
}
 
JavaScript:
var getMaximumXor = function(nums, maximumBit) {
    const m = (1 << maximumBit) - 1;
    for (let i = 1; i < nums.length; i++) {
        nums[i] ^= nums[i-1];
    }
    return nums.map(n => n ^ m).reverse();
};
 
C++:
class Solution {
public:
    vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
        
        vector<int> count(20, 0);
        int n = nums.size();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 20; j++) {
                if ((nums[i] & (1 << j)) != 0) {
                    count[j]++;
                }
            }
        }

        vector<int> ans;
        int lastElement = n - 1;

        for (int i = 0; i < n; i++) {
            int tmp = 0;
            for (int j = maximumBit - 1; j >= 0; j--) {
                if (count[j] % 2 != 1) tmp += powerOf(j);
            }
            ans.push_back(tmp);
            for (int j = 0; j < 20; j++) {
                if ((nums[lastElement] & (1 << j)) != 0) {
                    count[j]--;
                }
            }
            lastElement--;
        }

        return ans;
    }

    int powerOf(int order) {
        int ans = 1;
        for (int i = 1; i <= order; i++) {
            ans *= 2;
        }
        return ans;
    }
};
 
mấy fency viết code gì dài kinh dị vậy
JavaScript:
function getMaximumXor(nums: number[], b: number): number[] {
    const n = nums.length;
    const res = new Array(n)
    let cur = (1 << b) - 1;
    for (let i = 0; i < n; i++) cur^= nums[i], res[n - 1 - i] = cur
    return res;
}
 
Sửa lần cuối:
C++:
class Solution {
public:
    vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
        vector<int> vec(nums.size());
        vec[0] = nums[0];
        for (int i = 1; i < nums.size(); i++) vec[i] = vec[i-1] ^ nums[i];
        vector<int> ans;
        for (int i = nums.size() - 1; i >= 0; i--) {
            int t = 0;
            for (int j = 0; j < maximumBit; j++) {
                if (((vec[i] >> j) & 1) == 0) t += pow(2, j);
            }
            ans.push_back(t);
        }
        return ans;
    }
};
 
Java:
class Solution {
    public int[] getMaximumXor(int[] nums, int maximumBit) {
        int n = nums.length;
        int[] ans = new int[n];
        int[] res = new int[n];
        int max = (1 << maximumBit) - 1;
        for (int i = 0; i < n; i++) {
            if (i == 0) ans[i] = nums[i];
            else ans[i] = ans[i - 1] ^ nums[i];
        }
        for (int i = ans.length - 1; i >= 0 ; i--) {
            ans[i] ^= max;
        }
        for (int i = ans.length - 1; i >= 0 ; i--) {
            res[n - 1 - i] = ans[i];
        }
        return res;
    }
}
tạo 2 mảng chi vậy fency :angry:
 
Java:
class Solution {
    public int[] getMaximumXor(int[] nums, int maximumBit) {
        int n =nums.length;
        int[] res = new int[n];
        int prefix =0;
        int max = (int)Math.pow(2,maximumBit)-1;

        for(int i =0; i < n ;i++){
            prefix  = prefix^nums[i];
            int k=0;
            int bits = Integer.bitCount(prefix);
            res[n-1-i] = prefix>>(bits-maximumBit>=0?bits-maximumBit:0) ^ max;
        }

        return res;
    }
}
 
Bài này AC hơi cao hư cấu nhỉ, nhưng mà làm quen bit manipulation cũng không khó lắm
Python:
class Solution:
    def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
        n = len(nums)
        xOr = 0
        for num in nums:
            xOr = xOr ^ num
    
        maxK = 2**maximumBit
        ans = []
        for i in range(n - 1, -1, -1):
            current = 0
            currentK = maxK
            for j in range(32, -1, -1):
                if xOr >> j & 1 == 0 and 1 << j < currentK:
                    currentK -= 1 << j
                    current |= 1 << j

            ans.append(current)
            xOr ^= nums[i]
        return ans

Python:
class Solution:
    def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
        n = len(nums)
        xOr = 0
        for num in nums:
            xOr = xOr ^ num
     
        maxK = (1 << maximumBit) - 1
        ans = [0]*n
        for i in range(n - 1, -1, -1):
            ans[n - i - 1] = maxK ^ xOr
            xOr ^= nums[i]
         
        return ans
=> Đã hiểu lí do, thế mà ko nghĩ ra cách đơn giản thế nghĩ hơi phức tạp
Bài này ai mà ko quen xử lý bit thì cũng khoai phết, AC cao em đoán chắc đọc sol luôn cho nhanh chứ ko biết xử lý bit thì ngồi ngâm cả ngày cũng ko ra.
 
tạo 2 mảng chi vậy fency :angry:
Không quen dùng built-in function để reverse cái array nên e tạo mịa cái mới luôn
meoqQpA.png

Java:
class Solution {
    public int[] getMaximumXor(int[] nums, int maximumBit) {
        int n = nums.length;
        int[] ans = new int[n];
        int max = (1 << maximumBit) - 1;
        for (int i = 0; i < n; i++) {
            if (i == 0) ans[i] = nums[i];
            else ans[i] = ans[i - 1] ^ nums[i];
        }
        for (int i = 0; i < n; i++) {
            ans[i] ^= max;
        }
        for (int i = 0; i < n / 2; i++) {
            int tmp = ans[i];
            ans[i] = ans[n - 1 - i];
            ans[n - 1 - i] = tmp;
        }
        return ans;
    }
}
 
Sửa lần cuối:
Java:
class Solution {
    public int[] getMaximumXor(int[] nums, int maximumBit) {
        int n =nums.length;
        int[] res = new int[n];
        int prefix =0;
        int max = (int)Math.pow(2,maximumBit)-1;

        for(int i =0; i < n ;i++){
            prefix  = prefix^nums[i];
            int k=0;
            int bits = Integer.bitCount(prefix);
            res[n-1-i] = prefix>>(bits-maximumBit>=0?bits-maximumBit:0) ^ max;
        }

        return res;
    }
}
chủ tịch nay dùng acc clone à :D
 
Bài này AC hơi cao hư cấu nhỉ, nhưng mà làm quen bit manipulation cũng không khó lắm
Python:
class Solution:
    def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
        n = len(nums)
        xOr = 0
        for num in nums:
            xOr = xOr ^ num
 
        maxK = 2**maximumBit
        ans = []
        for i in range(n - 1, -1, -1):
            current = 0
            currentK = maxK
            for j in range(32, -1, -1):
                if xOr >> j & 1 == 0 and 1 << j < currentK:
                    currentK -= 1 << j
                    current |= 1 << j

            ans.append(current)
            xOr ^= nums[i]
        return ans

Python:
class Solution:
    def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
        n = len(nums)
        xOr = 0
        for num in nums:
            xOr = xOr ^ num
  
        maxK = (1 << maximumBit) - 1
        ans = [0]*n
        for i in range(n - 1, -1, -1):
            ans[n - i - 1] = maxK ^ xOr
            xOr ^= nums[i]
      
        return ans
=> Đã hiểu lí do, thế mà ko nghĩ ra cách đơn giản thế nghĩ hơi phức tạp
có cái constraint: 0 <= nums < 2^maximumBit mà ko biết đi xử lí mệt chết luon
uwooUzw.gif
 
Sửa lần cuối:
Bài dễ, làm 5p :sure:

Đề yêu cầu tìm số k sao cho nums[0] ^ nums[1] ^ ... ^ nums[n-1] ^ k là số lớn nhất < 2^maxbit
-> Ta có thể suy luận được số lớn nhất có thể là 2^maxbit - 1, và từ bất kì số nào ta cũng luôn có thể tìm được số k sao cho số đó xor với k = 2 ^ maxbit - 1

C++:
class Solution {
public:
    vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
        int max_num = (1 << maximumBit) - 1;
        int n = nums.size();
        int r = nums.size();
        vector<int> result(n);

        int xor_sum = 0;
        for (const int &num : nums) {
            xor_sum ^= num;
            result[--r] = max_num ^ xor_sum;
        }
        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.214.302
Quay lại
Lên đầu trang