Skip to content

Commit 3cf7b2a

Browse files
committed
practice
1 parent 56eef7b commit 3cf7b2a

4 files changed

+288
-2
lines changed
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* @lc app=leetcode.cn id=976 lang=java
3+
*
4+
* [976] 三角形的最大周长
5+
*
6+
* https://leetcode.cn/problems/largest-perimeter-triangle/description/
7+
*
8+
* algorithms
9+
* Easy (57.49%)
10+
* Likes: 262
11+
* Dislikes: 0
12+
* Total Accepted: 91.6K
13+
* Total Submissions: 159.4K
14+
* Testcase Example: '[2,1,2]'
15+
*
16+
* 给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回
17+
* 0。
18+
*
19+
*
20+
*
21+
*
22+
*
23+
*
24+
* 示例 1:
25+
*
26+
*
27+
* 输入:nums = [2,1,2]
28+
* 输出:5
29+
* 解释:你可以用三个边长组成一个三角形:1 2 2。
30+
*
31+
*
32+
* 示例 2:
33+
*
34+
*
35+
* 输入:nums = [1,2,1,10]
36+
* 输出:0
37+
* 解释:
38+
* 你不能用边长 1,1,2 来组成三角形。
39+
* 不能用边长 1,1,10 来构成三角形。
40+
* 不能用边长 1、2 和 10 来构成三角形。
41+
* 因为我们不能用任何三条边长来构成一个非零面积的三角形,所以我们返回 0。
42+
*
43+
*
44+
*
45+
* 提示:
46+
*
47+
*
48+
* 3 <= nums.length <= 10^4
49+
* 1 <= nums[i] <= 10^6
50+
*
51+
*
52+
*/
53+
54+
// @lc code=start
55+
56+
import java.util.Arrays;
57+
58+
class Solution {
59+
public int largestPerimeter(int[] nums) {
60+
Arrays.sort(nums);
61+
62+
for (int i = nums.length - 1; i >= 2; i--) {
63+
if (nums[i] < nums[i - 1] + nums[i - 2])
64+
return nums[i] + nums[i - 1] + nums[i - 2];
65+
}
66+
67+
return 0;
68+
}
69+
}
70+
// @lc code=end
+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
* @lc app=leetcode.cn id=2047 lang=java
3+
*
4+
* [2047] 句子中的有效单词数
5+
*
6+
* https://leetcode.cn/problems/number-of-valid-words-in-a-sentence/description/
7+
*
8+
* algorithms
9+
* Easy (38.49%)
10+
* Likes: 69
11+
* Dislikes: 0
12+
* Total Accepted: 29.3K
13+
* Total Submissions: 76.3K
14+
* Testcase Example: '"cat and dog"'
15+
*
16+
* 句子仅由小写字母('a' 到 'z')、数字('0' 到 '9')、连字符('-')、标点符号('!'、'.' 和 ',')以及空格('
17+
* ')组成。每个句子可以根据空格分解成 一个或者多个 token ,这些 token 之间由一个或者多个空格 ' ' 分隔。
18+
*
19+
* 如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:
20+
*
21+
*
22+
* 仅由小写字母、连字符和/或标点(不含数字)组成。
23+
* 至多一个 连字符 '-' 。如果存在,连字符两侧应当都存在小写字母("a-b" 是一个有效单词,但 "-ab" 和 "ab-" 不是有效单词)。
24+
* 至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。
25+
*
26+
*
27+
* 这里给出几个有效单词的例子:"a-b."、"afad"、"ba-c"、"a!" 和 "!" 。
28+
*
29+
* 给你一个字符串 sentence ,请你找出并返回 sentence 中 有效单词的数目 。
30+
*
31+
*
32+
*
33+
* 示例 1:
34+
*
35+
*
36+
* 输入:sentence = "cat and dog"
37+
* 输出:3
38+
* 解释:句子中的有效单词是 "cat"、"and" 和 "dog"
39+
*
40+
*
41+
* 示例 2:
42+
*
43+
*
44+
* 输入:sentence = "!this 1-s b8d!"
45+
* 输出:0
46+
* 解释:句子中没有有效单词
47+
* "!this" 不是有效单词,因为它以一个标点开头
48+
* "1-s" 和 "b8d" 也不是有效单词,因为它们都包含数字
49+
*
50+
*
51+
* 示例 3:
52+
*
53+
*
54+
* 输入:sentence = "alice and bob are playing stone-game10"
55+
* 输出:5
56+
* 解释:句子中的有效单词是 "alice"、"and"、"bob"、"are" 和 "playing"
57+
* "stone-game10" 不是有效单词,因为它含有数字
58+
*
59+
*
60+
*
61+
*
62+
* 提示:
63+
*
64+
*
65+
* 1 <= sentence.length <= 1000
66+
* sentence 由小写英文字母、数字(0-9)、以及字符(' '、'-'、'!'、'.' 和 ',')组成
67+
* 句子中至少有 1 个 token
68+
*
69+
*
70+
*/
71+
72+
// @lc code=start
73+
class Solution {
74+
public int countValidWords(String sentence) {
75+
int count = 0;
76+
77+
String[] words = sentence.split(" ");
78+
for (String word : words) {
79+
if (isValid(word))
80+
count++;
81+
}
82+
83+
return count;
84+
}
85+
86+
private boolean isValid(String word) {
87+
int n = word.length();
88+
if (n == 0)
89+
return false;
90+
91+
for (int i = 0, j = 0, k = 0; i < n; i++) {
92+
char c = word.charAt(i);
93+
if (Character.isDigit(c))
94+
return false;
95+
96+
if (c == ' ')
97+
return false;
98+
99+
if (c == '-' && ++j >= 0) {
100+
if (j > 1 || (i == 0 || i == n - 1))
101+
return false;
102+
103+
if (!Character.isLetter(word.charAt(i - 1)) || !Character.isLetter(word.charAt(i + 1)))
104+
return false;
105+
}
106+
107+
if ((c == '!' || c == '.' || c == ',') && ++k >= 0) {
108+
if (k > 1 || (i != n - 1))
109+
return false;
110+
}
111+
}
112+
113+
return true;
114+
}
115+
}
116+
// @lc code=end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* @lc app=leetcode.cn id=2809 lang=java
3+
*
4+
* [2809] 使数组和小于等于 x 的最少时间
5+
*
6+
* https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/description/
7+
*
8+
* algorithms
9+
* Hard (39.37%)
10+
* Likes: 42
11+
* Dislikes: 0
12+
* Total Accepted: 2.3K
13+
* Total Submissions: 4.7K
14+
* Testcase Example: '[1,2,3]\n[1,2,3]\n4'
15+
*
16+
* 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒,对于所有下标 0 <= i < nums1.length
17+
* ,nums1[i] 的值都增加 nums2[i] 。操作 完成后 ,你可以进行如下操作:
18+
*
19+
*
20+
* 选择任一满足 0 <= i < nums1.length 的下标 i ,并使 nums1[i] = 0 。
21+
*
22+
*
23+
* 同时给你一个整数 x 。
24+
*
25+
* 请你返回使 nums1 中所有元素之和 小于等于 x 所需要的 最少 时间,如果无法实现,那么返回 -1 。
26+
*
27+
*
28+
*
29+
* 示例 1:
30+
*
31+
*
32+
* 输入:nums1 = [1,2,3], nums2 = [1,2,3], x = 4
33+
* 输出:3
34+
* 解释:
35+
* 第 1 秒,我们对 i = 0 进行操作,得到 nums1 = [0,2+2,3+3] = [0,4,6] 。
36+
* 第 2 秒,我们对 i = 1 进行操作,得到 nums1 = [0+1,0,6+3] = [1,0,9] 。
37+
* 第 3 秒,我们对 i = 2 进行操作,得到 nums1 = [1+1,0+2,0] = [2,2,0] 。
38+
* 现在 nums1 的和为 4 。不存在更少次数的操作,所以我们返回 3 。
39+
*
40+
*
41+
* 示例 2:
42+
*
43+
*
44+
* 输入:nums1 = [1,2,3], nums2 = [3,3,3], x = 4
45+
* 输出:-1
46+
* 解释:不管如何操作,nums1 的和总是会超过 x 。
47+
*
48+
*
49+
*
50+
*
51+
* 提示:
52+
*
53+
*
54+
* 1 <= nums1.length <= 10^3
55+
* 1 <= nums1[i] <= 10^3
56+
* 0 <= nums2[i] <= 10^3
57+
* nums1.length == nums2.length
58+
* 0 <= x <= 10^6
59+
*
60+
*
61+
*/
62+
63+
// @lc code=start
64+
65+
import java.util.ArrayList;
66+
import java.util.Arrays;
67+
import java.util.List;
68+
69+
class Solution {
70+
public int minimumTime(List<Integer> nums1, List<Integer> nums2, int x) {
71+
int n = nums1.size(), sum1 = 0, sum2 = 0;
72+
int[] dp = new int[n + 1];
73+
74+
List<List<Integer>> list = new ArrayList<>();
75+
for (int i = 0; i < n; i++) {
76+
int a = nums1.get(i), b = nums2.get(i);
77+
list.add(Arrays.asList(b, a));
78+
79+
sum1 += a;
80+
sum2 += b;
81+
}
82+
83+
list.sort((a, b) -> a.get(0) - b.get(0));
84+
85+
for (int i = 1; i <= n; i++) {
86+
int a = list.get(i - 1).get(1);
87+
int b = list.get(i - 1).get(0);
88+
89+
for (int j = i; j > 0; j--)
90+
dp[j] = Math.max(dp[j], dp[j - 1] + j * b + a);
91+
}
92+
93+
for (int i = 0; i <= n; i++)
94+
if (sum2 * i + sum1 - dp[i] <= x)
95+
return i;
96+
97+
return -1;
98+
}
99+
}
100+
// @lc code=end

rename.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ def rename(n):
1010

1111
for root, _, files in os.walk(PATH, topdown=True):
1212
for f in files:
13-
if re.match(r'\d+\.\w+', f):
14-
index = f.find('.')
13+
if re.match(r"\d+\.\w+", f):
14+
index = f.find(".")
1515

1616
if index == n:
1717
continue

0 commit comments

Comments
 (0)