Cố Trường Ca
Senior Member
sao toàn bài khó không vậy mấy ní
sao toàn bài khó không vậy mấy ní
. Các bác có list bài tập nào dạng này để tu luyện thêm kh?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;
}
}
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]))
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;
}
};
map cái aeiou vô list 01234 là ok mà cần gì switch case fenBà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; } }
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
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 ạmap cái aeiou vô list 01234 là ok mà cần gì switch case fen
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;
}
}
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);
}
}
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
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 à![]()
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;
}
}
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;
}
}
Java nó support initialization mà, mình thấy thế này ok rồi đó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; } }

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)
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
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
}
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
}
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
}
/**
* @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;
};
Ặc em quên béng mất Java cho init thế này. Cảm ơn bác review ạJava nó support initialization mà, mình thấy thế này ok rồi đó
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
);
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));
}
}
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;
}
}

cóp sol thôidaily hôm nay em chạy 2 vòng for bị TLE 2 case cuối , giờ nên làm sao nhỉ mọi người![]()