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 getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
        mask = 2**maximumBit - 1
        xor = nums[0]
        n = len(nums)
        res = []
        for i in range(1, n):
            xor ^= nums[i]
        for i in range(n-1,-1,-1):
            res.append(xor ^ mask)
            xor ^= nums[i]
        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
Để lớn nhất thì cần tìm số bù của prefixXor thoai
 
Nếu nums bất kì thì cái cách xor với 2**max - 1 ko đúng. Phức tạp hơn
Nên nhìn cái solution mình ko hiểu tại sao nó đúng cho tới khi nhìn tới cái constrain
Nums bất kỳ thì thím xor với max INT xong lấy và với 2<<max -1 thôi.
Nói chung bài này constrain làm cho tính toán bit dễ hơn nhiều roài. Mình toàn làm r mới soi constraint =)))
 
Python:
class Solution(object):
    def getMaximumXor(self, nums, maximumBit):
        """
        :type nums: List[int]
        :type maximumBit: int
        :rtype: List[int]
        """
        res = []
        k = (1 << maximumBit) - 1
        xor_all = reduce(lambda x,y: x^y, nums)
        for i in range(len(nums)-1, -1, -1):

            res.append(xor_all ^ k)
            xor_all ^= nums[i]
        
        return res
lúc đầu không biết cứ tính lại xor_all sau mỗi lần xóa phần tử cuối, hóa ra chỉ cần xor với pt đó là xóa đc đi. a^a =0, x^0 = x => x^a = x ^a ^a
 
chứng minh kiểu gì thế bác?
Vì nếu 1 num < 2**bit thì ở mỗi phép xOr chỉ có thể flips được tối đa tất cả các bit về 1, nghĩa là 2**maxBit - 1. Vì phép toán XOR nó chỉ cho phép flip bit.
ví dụ 2**3 thì tối đa chỉ có thể tạo ra được 2**3 - 1 = 7
=> xOr^x = 2**maxBit - 1 với x là số cần tìm.
=> xOr^xOr^x = (2**maxBit - 1)^xOr => x = (2**maxBit - 1)^xOr

Còn nếu như nums là bất kì thì đầu tiên cần tính xOr của mảng, sau rồi flip xOr dần dần từ bit 0 lớn nhất của xOr vì việc flip bit 1 nó sẽ tạo ra 1 số nhỏ hơn. Mà để flip bit 0 lớn nhất của xOr thì cần 1 bit 1 ở vị trí đấy, nên mình chỉ việc so sánh (1 << i) < 2**k thì thêm cái bit 1 vô kết quả cuối cùng là xong.
 
Python:
class Solution(object):
    def getMaximumXor(self, nums, maximumBit):
        """
        :type nums: List[int]
        :type maximumBit: int
        :rtype: List[int]
        """
        res = []
        k = (1 << maximumBit) - 1
        xor_all = reduce(lambda x,y: x^y, nums)
        for i in range(len(nums)-1, -1, -1):

            res.append(xor_all ^ k)
            xor_all ^= nums[i]
       
        return res
lúc đầu không biết cứ tính lại xor_all sau mỗi lần xóa phần tử cuối, hóa ra chỉ cần xor với pt đó là xóa đc đi. a^a =0, x^0 = x => x^a = x ^a ^a
Có thể tính prefix rồi lưu kết quả vào mảng ban đầu để trả về :big_smile:
 
C++:
class Solution {
public:
    vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
        int acc = 0;
        for (int n: nums) acc ^= n;

        int exclude = 0;
        vector<int> res;
        for (int i = nums.size() - 1; i >= 0; i--) {
            acc ^= exclude;

            int k = 0;
            int tmp = acc;
            for (int j = 0; j < maximumBit; j++) {
                if (tmp & 1)
                    k &= ~(1<<j);
                else
                    k |= (1<<j);
                tmp >>= 1;
            }
            res.push_back(k);

            exclude = nums[i];
        }

        return res;
    }
};
 
mấy ngày ko vào thớt chơi, thím @Cố Trường Ca lại bay màu rồi à
6gCweAP.png
 
Mấy bác nghĩ ra quả giải thuật hay thật, em làm là đếm số bit 1 ở từng vị trí, số k của mình phải thỏa mãn sao cho tổng số bit 1 ở từng vị trí luôn là số lẻ là được.
 
Mấy bác nghĩ ra quả giải thuật hay thật, em làm là đếm số bit 1 ở từng vị trí, số k của mình phải thỏa mãn sao cho tổng số bit 1 ở từng vị trí luôn là số lẻ là được.
bài này có giải thật j đâu :shame: max là 11111111-1 , numsxor ^ k = max thì k = max ^ numsxor thôi mà
 
Java:
class Solution {
    public int[] getMaximumXor(int[] nums, int maximumBit) {
        int n = nums.length;
        int[] prefix = new int[n+1];
        int[] res = new int[n];
        for(int i=0;i<n;i++){
            prefix[i+1] = prefix[i]^nums[i];
        }
        for(int i = n;i>0;i--){
            int c = prefix[i];
            int k = 0;
            while(k<maximumBit) {
                int x = (1- c & 1 ) << k;
                res[n- i] += (1 - c & 1) << k;
                c >>= 1;
                k++;
            }
        }
        return res;
    }
}

chết mẹ ko để ý 0 <= nums < 2maximumBit :amazed:
Java:
class Solution {
    public int[] getMaximumXor(int[] nums, int maximumBit) {
        int n = nums.length;
        int currXor = 0;
        int[] res = new int[n];
        int max = (1<<maximumBit) -1;
        for(int i=0;i<n;i++){
            currXor^=nums[i];
            res[n-1-i] = currXor^max;
        }
        return res;
    }
}
 
Sửa lần cuối:
Mã:
func getMaximumXor(nums []int, maximumBit int) []int {
    n := len(nums)
    result := make([]int, n)
    maxNum := (1 << maximumBit) - 1

    currXor := 0

    for i := range nums {
        currXor ^= nums[i]
    }

    for i := 0; i < n; i++ {
        k := currXor ^ maxNum
        result[i] = k

        if i < n-1 {
            currXor ^= nums[n-1-i]
        }

    }

    return result
}
 
Medium giả cầy.

Swift:
class Solution {
    func getMaximumXor(_ nums: [Int], _ maximumBit: Int) -> [Int] {
        let max = (1 << maximumBit) - 1
        var result:[Int] = []
        var xor = 0
        for num in nums {
            xor ^= num
            result.append(max^xor)
        }
        return Array(result.reversed())
    }
}
 
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.214.596
Quay lại
Lên đầu trang