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.
sao toàn bài khó không vậy mấy ní
meoqQpA.png
Phải có khó mới có khôn, nhớ mua khóa học udemy của @MasonMaoSuVuong là lên trình liền
 
Bài hôm nay làm em thở oxi quá =((. Các bác có list bài tập nào dạng này để tu luyện thêm kh?
Java:
class Solution {
    public int findTheLongestSubstring(String s) {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        int res = 0, prefixXor = 0, n = s.length();

        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            switch(ch) {
                case 'a':
                    prefixXor ^= 1;
                    break;
                case 'e':
                    prefixXor ^= (1 << 1);
                    break;
                case 'i':
                    prefixXor ^= (1 << 2);
                    break;
                case 'o':
                    prefixXor ^= (1 << 3);
                    break;
                case 'u':
                    prefixXor ^= (1 << 4);
                    break;
                default:
                    break;
            }

            if (map.containsKey(prefixXor)) {
                res = Math.max(res, i - map.get(prefixXor));
            } else {
                map.put(prefixXor, i);
            }
        }

        return res;
    }
}
 
Nay gặp mấy bài về bucket sort với radix sort rồi đấy
Python:
class Solution:
    def findMinDifference(self, timePoints: List[str]) -> int:
        times = []
        for timePoint in timePoints:
            hh, mm = timePoint.split(":")
            times.append(int(mm) + 60*int(hh))
        def getDiff(m1, m2):
            total = 60*24
            ans = min(m2 - m1, total - m2 + m1)
            return ans
        times = sorted(times)
        n = len(times)
        ans = inf
        for i in range(1, n):
            ans = min(ans, getDiff(times[i - 1], times[i]))
    
        return min(ans, getDiff(times[0], times[n - 1]))
 
C++:
class Solution {
public:
    const int MINUTES_PER_HOUR = 60;
    const int MINUTES_PER_DAY = 24 * 60;

    int findMinDifference(vector<string>& timePoints) {
        auto to_minute = [&](string &time_point) -> int {
            string hh = time_point.substr(0, 2), mm = time_point.substr(3, 2);
            return stoi(hh) * MINUTES_PER_HOUR + stoi(mm);
        };

        vector<int> minutes;
        for (auto &time_point: timePoints) {
            minutes.push_back(to_minute(time_point));
        }

        int ans = INT_MAX;
        sort(minutes.begin(), minutes.end());
        minutes.push_back(minutes[0] + MINUTES_PER_DAY);
        for (int i = 0; i < minutes.size() - 1; i++) {
            int from = minutes[i], to = minutes[i + 1];
            ans = min(ans, to - from);
        }

        return ans;
    }
};
 
Bài hôm nay làm em thở oxi quá =((. Các bác có list bài tập nào dạng này để tu luyện thêm kh?
Java:
class Solution {
    public int findTheLongestSubstring(String s) {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        int res = 0, prefixXor = 0, n = s.length();

        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            switch(ch) {
                case 'a':
                    prefixXor ^= 1;
                    break;
                case 'e':
                    prefixXor ^= (1 << 1);
                    break;
                case 'i':
                    prefixXor ^= (1 << 2);
                    break;
                case 'o':
                    prefixXor ^= (1 << 3);
                    break;
                case 'u':
                    prefixXor ^= (1 << 4);
                    break;
                default:
                    break;
            }

            if (map.containsKey(prefixXor)) {
                res = Math.max(res, i - map.get(prefixXor));
            } else {
                map.put(prefixXor, i);
            }
        }

        return res;
    }
}
map cái aeiou vô list 01234 là ok mà cần gì switch case fen
 
Python:
class Solution:
    def findMinDifference(self, timePoints: List[str]) -> int:
        timePoints.sort()

        def getDifference(s1, s2):
            h1, h2 = int(s1[:2]), int(s2[:2])
            m1, m2 = int(s1[3:]), int(s2[3:])

            min1 = (h2 * 60 + m2) - (h1 * 60 + m1)
            min2 =  (24 * 60) - (h2 * 60 + m2) + (h1 * 60 + m1)

            return min(min1, min2)

        
        result = 10000
        n = len(timePoints)
        for i in range(0, n - 1):
            diff = getDifference(timePoints[i], timePoints[i+1])
            if result > diff:
                result = diff
        
        result = min(result, getDifference(timePoints[0], timePoints[-1]))
        return result
 
map cái aeiou vô list 01234 là ok mà cần gì switch case fen
Do em thấy map đống này bên Java code khá loằng ngoằng nên em xài switch case á bác. Dạo một vòng cũng kh thấy solution nào clean vụ mapping nên em để thế luôn. Bác thẩm giúp em xem code như nào clean hơn ạ

Java:
class Solution {
    public int findTheLongestSubstring(String s) {
        Map<Character, Integer> vowelMap = new HashMap<>();
        vowelMap.put('a', 0);
        vowelMap.put('e', 1);
        vowelMap.put('i', 2);
        vowelMap.put('o', 3);
        vowelMap.put('u', 4);

        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        int res = 0, prefixXor = 0, n = s.length();

        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            if (vowelMap.containsKey(ch)) {
                prefixXor ^= (1 << vowelMap.get(ch));
            }

            if (map.containsKey(prefixXor)) {
                res = Math.max(res, i - map.get(prefixXor));
            } else {
                map.put(prefixXor, i);
            }
        }

        return res;
    }
}
 
Java:
class Solution {
    public int findMinDifference(List<String> timePoints) {
        int min = Integer.MAX_VALUE;   
        List<Integer> times = new ArrayList<>();
        for (String timePoint : timePoints) {
            int time = convertHour(timePoint);
            times.add(time);
        }
        Collections.sort(times);
        for (int i = 1; i < times.size(); i++) {
            min = Math.min(min, times.get(i) - times.get(i - 1));
        }
        return Math.min(min, 24 * 60 - times.get(times.size() - 1) + times.get(0));
    }

    private int convertHour(String time) {
        String hour = time.split(":")[0];
        String minute = time.split(":")[1];
        return Integer.parseInt(hour) * 60 + Integer.parseInt(minute);
    }

}
 
Mã:
class Solution:
    def findMinDifference(self, timePoints: List[str]) -> int:

        def convert_to_minutes(time_str):
            time_obj = datetime.strptime(time_str, "%H:%M")
            return time_obj.hour * 60 + time_obj.minute

        ans = [convert_to_minutes(tp) for tp in timePoints]
        
        ans.sort()
        
        min_diff = (1440 + ans[0] - ans[-1]) % 1440
        
        for i in range(1, len(ans)):
            min_diff = min(min_diff, ans[i] - ans[i-1])
        
        return min_diff

ae chưa dậy à
Ty1i6JL.png
 
Mã:
class Solution:
    def findMinDifference(self, timePoints: List[str]) -> int:

        def convert_to_minutes(time_str):
            time_obj = datetime.strptime(time_str, "%H:%M")
            return time_obj.hour * 60 + time_obj.minute

        ans = [convert_to_minutes(tp) for tp in timePoints]
      
        ans.sort()
      
        min_diff = (1440 + ans[0] - ans[-1]) % 1440
      
        for i in range(1, len(ans)):
            min_diff = min(min_diff, ans[i] - ans[i-1])
      
        return min_diff

ae chưa dậy à
Ty1i6JL.png
Java:
class Solution {
    public int findMinDifference(List<String> timePoints) {
        int res=1500;
        int max = 24*60;
        int pre = -1;
        List<Integer> mins = new ArrayList();
        for(String time:timePoints){
            int hours = Integer.parseInt(time.substring(0,2));
            int minutes =Integer.parseInt(time.substring(3));
            mins.add(hours*60 + minutes);
        }

        Collections.sort(mins);
        mins.add(mins.get(0));
        for(int i=0,j=1; j<mins.size();i++,j++){
            int diff = Math.abs(mins.get(j)-mins.get(i));
            diff = diff>max/2? max -diff:diff;
            res = Math.min(res, diff);
        }

        return res;
    }
}
ZpMBJjL.png
tới liền tới liền
 
Sort rồi thì không cần check lại vòng lớn nữa, chỉ cần check vòng lớn 2 edge points là được
Java:
class Solution {
    public int findMinDifference(List<String> timePoints) {
        int n = timePoints.size(), min = Integer.MAX_VALUE, minutes[] = new int[n];

        for (int i = 0; i < n; i++) {
            minutes[i] = toMinutes(timePoints.get(i));
        }

        Arrays.sort(minutes);

        for (int i = 1; i < n; i++) {
            min = Math.min(minutes[i] - minutes[i - 1], min);
        }

        return Math.min(min, 1440 - (minutes[n - 1] - minutes[0]));
    }

    private int toMinutes(String time) {
        String[] hoursAndMinutes = time.split(":");
        int hours = Integer.parseInt(hoursAndMinutes[0]), minutes = Integer.parseInt(hoursAndMinutes[1]);
        return hours * 60 + minutes;
    }
}
 
Do em thấy map đống này bên Java code khá loằng ngoằng nên em xài switch case á bác. Dạo một vòng cũng kh thấy solution nào clean vụ mapping nên em để thế luôn. Bác thẩm giúp em xem code như nào clean hơn ạ

Java:
class Solution {
    public int findTheLongestSubstring(String s) {
        Map<Character, Integer> vowelMap = new HashMap<>();
        vowelMap.put('a', 0);
        vowelMap.put('e', 1);
        vowelMap.put('i', 2);
        vowelMap.put('o', 3);
        vowelMap.put('u', 4);

        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        int res = 0, prefixXor = 0, n = s.length();

        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            if (vowelMap.containsKey(ch)) {
                prefixXor ^= (1 << vowelMap.get(ch));
            }

            if (map.containsKey(prefixXor)) {
                res = Math.max(res, i - map.get(prefixXor));
            } else {
                map.put(prefixXor, i);
            }
        }

        return res;
    }
}
Java nó support initialization mà, mình thấy thế này ok rồi đó :ah:
Hạn chế xài switch case vì tính extensibility, ví dụ nếu muốn thêm 1 kí tự khác lại phải extend thêm case nữa
Map<Character, Integer> vowelMap = Map.of(
'a', 0,
'e', 1,
'i', 2,
'o', 3,
'u', 4
);
 
Python:
class Solution:
    def findMinDifference(self, timePoints: List[str]) -> int:
        A = [False] * 1440
       
        for t in timePoints:
            minutes = int(t[:2]) * 60 + int(t[3:])
            if A[minutes]:
                return 0 
            A[minutes] = True
       
        first = last = prev = -1
        ans = float('inf')
       
        for i in range(len(A)):
            if A[i]:
                if prev != -1:
                    ans = min(ans, i - prev)
                else:
                    first = i 
                prev = i 
                last = i
        return min(ans, 1440 + first - last)

Python:
class Solution:
    def findMinDifference(self, timePoints: List[str]) -> int:
        A = sorted([(int(t[:2]) * 60 + int(t[3:]) if int(t[:2])* 60 + int(t[3:]) is not 0 else 0 ) for t timePoints])
        A.append(A[0] + 1440)
        ans = float("inf")
        for i in range(1,len(A)):
            ans = min(ans, A[i] - A[i - 1])
        return ans
 
Mã:
func longestSubarray(nums []int) int {
    res := 1
    maxAnd := 0
    i:=0
    for ;i<len(nums);{
        temp := nums[i]
        j:=i
        for ;j<len(nums)&& temp >= nums[j];j++{
            if temp > temp & nums[j] {
                break
            }
            temp = temp & nums[j]
        }
        if maxAnd == temp {
            if res < j-i{
                res = j-i
            }
        } else if maxAnd < temp {
            maxAnd = temp
            res = j-i
        }
        i = j
    }  
    return res
}
Mã:
func findTheLongestSubstring(s string) int {
    // a, e, i, o, u
    n := len(s)
    arr := make([]int, n+1)
    first := make([]int, 32)
    for i:=1;i<32;i++{
        first[i] = -1
    }
    res := 0
    for i:=1;i<n+1;i++{
        switch s[i-1]{
            case 'a': arr[i] = arr[i-1] ^ 16
            case 'e': arr[i] = arr[i-1] ^ 8
            case 'i': arr[i] = arr[i-1] ^ 4
            case 'o': arr[i] = arr[i-1] ^ 2
            case 'u': arr[i] = arr[i-1] ^ 1
            default: arr[i] = arr[i-1]
        }
        if first[arr[i]] != -1 {
            if res < i - first[arr[i]] + 1{
                res = i - first[arr[i]]
            }
        } else {
            first[arr[i]] = i
        }
    }
   
    return res
}
Mã:
func sub(point1, point2 string) int {
    p1 := strings.Split(point1, ":")
    p2 := strings.Split(point2, ":")
    h1, _ := strconv.Atoi(p1[0])
    m1, _ := strconv.Atoi(p1[1])
    h2, _ := strconv.Atoi(p2[0])
    m2, _ := strconv.Atoi(p2[1])
    return h2*60 + m2 - h1*60- m1
}
func findMinDifference(timePoints []string) int {
    slices.Sort(timePoints)
    res := 10000
    n := len(timePoints)
    for i:=1;i<n;i++{
        x := sub(timePoints[i-1], timePoints[i])
        if x < res {
            res = x
        }
    }
    x := sub(timePoints[n-1], "24:00") + sub("00:00",timePoints[0])
    if x < res {
        return x
    }
    return res
}
 
JavaScript:
/**
 * @param {string[]} timePoints
 * @return {number}
 */
var findMinDifference = function(timePoints) {
    const arr = timePoints.map(s => {
        const [h, m] = s.split(':').map(Number);
        return h * 60 + m;
    }).sort((u, v) => u - v);
    let ans = 24 * 60 - (arr[arr.length - 1] - arr[0]);
    for (let i = 1; i < arr.length; i++) {
        ans = Math.min(ans, arr[i] - arr[i-1]);;
    }
    return ans;
};
 
Java nó support initialization mà, mình thấy thế này ok rồi đó :ah:
Hạn chế xài switch case vì tính extensibility, ví dụ nếu muốn thêm 1 kí tự khác lại phải extend thêm case nữa
Map<Character, Integer> vowelMap = Map.of(
'a', 0,
'e', 1,
'i', 2,
'o', 3,
'u', 4
);
Ặc em quên béng mất Java cho init thế này. Cảm ơn bác review ạ
 
Java:
class Solution {
    final int MIN_PER_DAY = 60 * 24;
    public int findMinDifference(List<String> timePoints) {
        int n = timePoints.size();

        List<Integer> minutes = new ArrayList<>();
        for (String timePoint : timePoints) {
            String hour = timePoint.split(":")[0];
            String minute = timePoint.split(":")[1];
            minutes.add(Integer.parseInt(hour) * 60 + Integer.parseInt(minute));
        }

        Collections.sort(minutes);

        int res = Integer.MAX_VALUE;
        for (int i = 1; i < n; i++) {
            res = Math.min(res, minutes.get(i) - minutes.get(i - 1));
        }

        return Math.min(res, MIN_PER_DAY - minutes.get(n - 1) + minutes.get(0));
    }
}
 
Java:
class Solution {
    public int findMinDifference(List<String> timePoints) {
        Set<Integer> set = new HashSet<>();
        
        String[] split;
        int temp;
      
        for (String s : timePoints) {
            split = s.split(":");
            temp = Integer.parseInt(split[0]) * 60 + Integer.parseInt(split[1]);
            if (set.contains(temp))
                return 0;
            
            set.add(temp);
        }

        if (set.contains(0))
            set.add(1440);

        List<Integer> list = new ArrayList<>();
        list = new ArrayList<>(set);
        Collections.sort(list);

        int min = Integer.MAX_VALUE;

        for (int i = 1; i < list.size(); i++) {
            temp = list.get(i) - list.get(i - 1);
            min = Math.min(temp, min);
        }

        if (!set.contains(1440)) {
            temp = list.get(0) + 1440 - list.get(list.size() - 1);
            return Math.min(temp, min);
        }

        return min;
    }
}
 
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.908
Quay lại
Lên đầu trang