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.
Java:
    public int missingNumber(int[] nums) {
        int sum = 0;
        int total = nums.length;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            total += i;
        }
        return total - sum;
    }
 
Python:
class Solution:
    def rangeBitwiseAnd(self, left: int, right: int) -> int:
        res = 0
        for bit_index in range(32, -1, -1):
            bit = 1 << bit_index
            if (bit & left) == (bit & right):
                res += (bit & left)
            else:
                break
        return res
 
Đếm số common bit 1 từ trái qua của left và right thôi.

Python:
class Solution:
    def rangeBitwiseAnd(self, left: int, right: int) -> int:
        shift = 0
        while left < right:
            left = left >> 1
            right = right >> 1
            shift += 1
        return left << shift
 
Java:
class Solution {
    public int rangeBitwiseAnd(int left, int right) {
        if (left == right){
            return left;
        }
        int c = 0;
        //long c = left & right;
        while (left != right){
            left >>= 1;
            right >>= 1;
            c++;
        }
        return left<<c;
    }
}
 
Java:
public static int rangeBitwiseAnd(int left, int right) {
    int count = 0;
    while (left < right) {
        left >>= 1;
        right >>= 1;
        count++;
    }
    return left << count;
}
 
JavaScript:
function rangeBitwiseAnd(left: number, right: number): number {
    let shift = 0;
    while (left < right) {
        left >>= 1;
        right >>=1;
        shift++;
    }
    return left << shift
};
 
vẫn như mọi lần, làm được nhưng xem cách giải người khác mới thấy người ta thông minh hơn
Python:
class Solution:
    def rangeBitwiseAnd(self, left: int, right: int) -> int:
        leftBinary = format(left, "031b")
        rightBinary = format(right, "031b")
        result = ""
        for i in range(31):
            if leftBinary[i] == rightBinary[i]:
                result += leftBinary[i]
            else:
                break
        if len(result) == 0:
            return 0
        numberResult = int(result, 2)
        if numberResult == 0:
            return 0
        return numberResult << (31 - len(result))
 
Ít luyện bitwise nên vẫn yếu quá, câu này phải đọc lời giải :beat_shot:

1708479245787.png

Cái pattern này hay vãi :oops:
1708479214158.png

Mã:
class Solution {
    public static int rangeBitwiseAnd(int left, int right) {
        int count = 0;
        while (left < right) {
            left >>= 1;
            right >>= 1;
            count++;
        }
        return left << count;
    }
  
}
 
Sửa lần cuối:
21/02/2024: Bài hôm nay khoai phết
C++:
    int rangeBitwiseAnd(int left, int right) {
        int ret = left;     
        for (long step = 1, i = step + left; i <= right; i += step){
            ret &= i;
            if (ret == 0) return 0;
            while ((ret & step) == 0) step <<= 1;
            if (i + step > right) return ret & right;
        }
        return ret;
    }
 
Đọc bài xong lú 1 hồi cũng tìm ra cách :d
Solution

Java:
class Solution {
    public int rangeBitwiseAnd(int left, int right) {
        while (right != 0 && right > left){
            right = right & (right - 1);
        }
        return right;
    }
}
 
JavaScript:
var rangeBitwiseAnd = function(left, right) {
    if (right === 0) {
        return 0;
    }
    let t = 1 << Math.trunc(Math.log2(right)), ans = 0;
    while (t && (t & left) === (t & right)) {
        ans |= t & left;
        t >>= 1;
    }
    return ans;
};
 
Thấy bọn viết ngắn vkl mà hok hiểu :|
C#:
public class Solution
{
    public int RangeBitwiseAnd(int left, int right)
    {
        int diff = right - left;
        if (diff == 0)
        {
            return left;
        }
        int result = 0;
        int leftCopy = left;
        int i = 0;
        int twoPow = 1;
        while (leftCopy > 0)
        {
            twoPow *= 2;
            int startBit = leftCopy % 2;
            int endBit = 0;
            if (startBit == 0)
            {
                endBit = 0;
                leftCopy >>= 1;
                i++;
                continue;
            }

            int order = left % twoPow;
            endBit = order + diff < twoPow ? 1 : 0;
            if (i == 30)
            {
                result += TwoPow(30);
            }
            else
            {
                result += endBit * (twoPow / 2);
            }

            leftCopy >>= 1;
            i++;
        }

        return result;
    }

    private int TwoPow(int p)
    {
        int result = 1;
        for (int i = 0; i < p; i++)
        {
            result *= 2;
        }

        return result;
    }
}
 
Java:
class Solution {
    public static int rangeBitwiseAnd(int left, int right) {
        int ans = 0;
        while (left != right) {
            left >>= 1;
            right >>= 1;
            ans++;
        }
        return left << 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.215.198
Quay lại
Lên đầu trang