Skip to content

Commit 37363bf

Browse files
author
932413237@qq.com
committed
提交若干题目
1 parent 33137d9 commit 37363bf

File tree

10 files changed

+508
-0
lines changed

10 files changed

+508
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。
2+
3+
示例 1:
4+
--
5+
```
6+
输入:n = 234
7+
输出:15
8+
解释:### [5211\. 概率最大的路径](https://leetcode-cn.com/contest/weekly-contest-197/problems/path-with-maximum-probability/)
9+
10+
Difficulty: **Medium**
11+
12+
给你一个由 `n` 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组成,其中 `edges[i] = [a, b]` 表示连接节点 a 和 b 的一条无向边,且该边遍历成功的概率为 `succProb[i]` 。
13+
14+
指定两个节点分别作为起点 `start` 和终点 `end` ,请你找出从起点到终点成功概率最大的路径,并返回其成功概率。
15+
16+
如果不存在从 `start` 到 `end` 的路径,请 **返回 0** 。只要答案与标准答案的误差不超过 **1e-5** ,就会被视作正确答案。
17+
18+
**示例 1:**
19+
20+
**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2020/07/12/1558_ex1.png)**
21+
22+
```
23+
输入:n = 3, edges = [[0,1],[1,2],[0,2]], succProb = [0.5,0.5,0.2], start = 0, end = 2
24+
输出:0.25000
25+
解释:从起点到终点有两条路径,其中一条的成功概率为 0.2 ,而另一条为 0.5 * 0.5 = 0.25
26+
```
27+
28+
**示例 2:**
29+
30+
**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2020/07/12/1558_ex2.png)**
31+
32+
```
33+
输入:n = 3, edges = [[0,1],[1,2],[0,2]], succProb = [0.5,0.5,0.3], start = 0, end = 2
34+
输出:0.30000
35+
```
36+
37+
**示例 3:**
38+
39+
**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2020/07/12/1558_ex3.png)**
40+
41+
```
42+
输入:n = 3, edges = [[0,1]], succProb = [0.5], start = 0, end = 2
43+
输出:0.00000
44+
解释:节点 0 和 节点 2 之间不存在路径
45+
```
46+
47+
**提示:**
48+
49+
* `2 <= n <= 10^4`
50+
* `0 <= start, end < n`
51+
* `start != end`
52+
* `0 <= a, b < n`
53+
* `a != b`
54+
* `0 <= succProb.length == edges.length <= 2*10^4`
55+
* `0 <= succProb[i] <= 1`
56+
* 每两个节点之间最多有一条边
57+
58+
#### Solution
59+
60+
Language: **Java**
61+
62+
```java
63+
class Solution {
64+
   public double maxProbability(int n, int[][] edges, double[] succProb, int start, int end) {
65+
66+
  }
67+
}
68+
```
69+
各位数之积 = 2 * 3 * 4 = 24
70+
各位数之和 = 2 + 3 + 4 = 9
71+
结果 = 24 - 9 = 15
72+
```
73+
示例 2:
74+
--
75+
```
76+
输入:n = 4421
77+
输出:21
78+
解释:
79+
各位数之积 = 4 * 4 * 2 * 1 = 32
80+
各位数之和 = 4 + 4 + 2 + 1 = 11
81+
结果 = 32 - 11 = 21
82+
```
83+
84+
提示:
85+
--
86+
```
87+
1 <= n <= 10^5
88+
```
89+
来源:力扣(LeetCode)
90+
链接:https://leetcode-cn.com/problems/subtract-the-product-and-sum-of-digits-of-an-integer
91+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package Problem_5211_概率最大的路径;
2+
3+
import java.util.HashMap;
4+
import java.util.HashSet;
5+
import java.util.Map;
6+
import java.util.Set;
7+
8+
class Solution {
9+
Map<Entry, Integer> indexMap = new HashMap<>();
10+
11+
public double maxProbability(int n, int[][] edges, double[] succProb, int start, int end) {
12+
Entry[] point = new Entry[n];
13+
for (int i = 0; i < point.length; i++) {
14+
point[i] = new Entry();
15+
indexMap.put(point[i], i);
16+
}
17+
for (int i = 0; i < edges.length; i++) {
18+
int pointIndex1 = edges[i][0];
19+
int pointIndex2 = edges[i][1];
20+
double thisSuccProb = succProb[i];
21+
point[pointIndex1].map.put(point[pointIndex2], thisSuccProb);
22+
point[pointIndex2].map.put(point[pointIndex1], thisSuccProb);
23+
}
24+
memo = new Double[n][n];
25+
return findMin(point[start], point[end], new HashSet<>());
26+
}
27+
28+
Double[][] memo;
29+
30+
private Double findMin(Entry entry1, Entry entry2, Set<Entry> path) {
31+
Double result = memo[indexMap.get(entry1)][indexMap.get(entry2)];
32+
if (result != null) return result;
33+
result = memo[indexMap.get(entry2)][indexMap.get(entry1)];
34+
if (result != null) return result;
35+
Set<Map.Entry<Entry, Double>> entries = entry1.map.entrySet();
36+
for (Map.Entry<Entry, Double> entry : entries) {
37+
if (path.contains(entry.getKey())) continue;
38+
path.add(entry.getKey());
39+
Double min = findMin(entry.getKey(), entry2, path);
40+
if (min != null) {
41+
if (result == null) result = min * entry.getValue();
42+
else result = Math.min(result, min * entry.getValue());
43+
}
44+
path.remove(entry.getKey());
45+
}
46+
memo[indexMap.get(entry2)][indexMap.get(entry1)] = result;
47+
memo[indexMap.get(entry1)][indexMap.get(entry2)] = result;
48+
return memo[indexMap.get(entry2)][indexMap.get(entry1)];
49+
}
50+
51+
class Entry {
52+
Map<Entry, Double> map = new HashMap<>();
53+
}
54+
}
55+
56+
class Test {
57+
public static void main(String[] args) {
58+
double v = new Solution().maxProbability(
59+
3,
60+
new int[][]{
61+
{0, 1},
62+
{1, 2},
63+
{0, 2}
64+
},
65+
new double[]{0.5, 0.5, 0.2},
66+
0,
67+
2);
68+
System.out.println(v);
69+
}
70+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
### [5460\. 好数对的数目](https://leetcode-cn.com/contest/weekly-contest-197/problems/number-of-good-pairs/)
2+
3+
Difficulty: **Easy**
4+
5+
给你一个整数数组 `nums`
6+
7+
如果一组数字 `(i,j)` 满足 `nums[i]` == `nums[j]``i` < `j` ,就可以认为这是一组 **好数对**
8+
9+
返回好数对的数目。
10+
11+
**示例 1:**
12+
13+
```
14+
输入:nums = [1,2,3,1,1,3]
15+
输出:4
16+
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
17+
```
18+
19+
**示例 2:**
20+
21+
```
22+
输入:nums = [1,1,1,1]
23+
输出:6
24+
解释:数组中的每组数字都是好数对
25+
```
26+
27+
**示例 3:**
28+
29+
```
30+
输入:nums = [1,2,3]
31+
输出:0
32+
```
33+
34+
**提示:**
35+
36+
* `1 <= nums.length <= 100`
37+
* `1 <= nums[i] <= 100`
38+
39+
#### Solution
40+
41+
Language: **Java**
42+
43+
```java
44+
class Solution {
45+
   public int numIdenticalPairs(int[] nums) {
46+
47+
  }
48+
}
49+
```
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package Problem_5460_好数对的数目;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
class Solution {
7+
public int numIdenticalPairs(int[] nums) {
8+
Map<Integer, Integer> map = new HashMap<>(); //key:nums value value:count
9+
for (int i = 0; i < nums.length; i++) {
10+
Integer count = map.get(nums[i]);
11+
if (count == null) count = 0;
12+
count++;
13+
map.put(nums[i], count);
14+
}
15+
int totalCount = 0;
16+
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
17+
int count;
18+
if ((count = entry.getValue()) <= 1) continue;
19+
int sum = 1;
20+
for (int i = 0; i < 2; i++) sum *= (count - i);
21+
sum /= 2;
22+
totalCount += sum;
23+
}
24+
return totalCount;
25+
}
26+
}
27+
28+
class Test {
29+
public static void main(String[] args) {
30+
int i = new Solution().numIdenticalPairs(
31+
new int[]{1,2,3,1,1,3}
32+
);
33+
System.out.println(i);
34+
}
35+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
### [5461\. 仅含 1 的子串数](https://leetcode-cn.com/contest/weekly-contest-197/problems/number-of-substrings-with-only-1s/)
2+
3+
Difficulty: **Medium**
4+
5+
给你一个二进制字符串 `s`(仅由 '0' 和 '1' 组成的字符串)。
6+
7+
返回所有字符都为 1 的子字符串的数目。
8+
9+
由于答案可能很大,请你将它对 10^9 + 7 取模后返回。
10+
11+
**示例 1:**
12+
13+
```
14+
输入:s = "0110111"
15+
输出:9
16+
解释:共有 9 个子字符串仅由 '1' 组成
17+
"1" -> 5 次
18+
"11" -> 3 次
19+
"111" -> 1 次
20+
```
21+
22+
**示例 2:**
23+
24+
```
25+
输入:s = "101"
26+
输出:2
27+
解释:子字符串 "1" 在 s 中共出现 2 次
28+
```
29+
30+
**示例 3:**
31+
32+
```
33+
输入:s = "111111"
34+
输出:21
35+
解释:每个子字符串都仅由 '1' 组成
36+
```
37+
38+
**示例 4:**
39+
40+
```
41+
输入:s = "000"
42+
输出:0
43+
```
44+
45+
**提示:**
46+
47+
* `s[i] == '0'``s[i] == '1'`
48+
* `1 <= s.length <= 10^5`
49+
50+
#### Solution
51+
52+
Language: **Java**
53+
54+
```java
55+
class Solution {
56+
   public int numSub(String s) {
57+
58+
  }
59+
}
60+
```
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package Problem_5461_仅含1的子串数;
2+
3+
import javafx.beans.binding.When;
4+
5+
import java.math.BigInteger;
6+
7+
class Solution {
8+
public int numSub(String s) {
9+
char[] chars = s.toCharArray();
10+
Integer start = null;
11+
BigInteger count = BigInteger.valueOf(0);
12+
int length = chars.length;
13+
for (int i = 0; i < length; i++) {
14+
if (chars[i] == '0') {
15+
if (start != null) {
16+
int tempLength = i - start;
17+
BigInteger result = BigInteger.valueOf(1 + tempLength).multiply(BigInteger.valueOf(tempLength)).divide(BigInteger.valueOf(2));
18+
count = count.add(result);
19+
start = null;
20+
}
21+
} else if (start == null)
22+
start = i;
23+
}
24+
if (start != null) {
25+
int tempLength = length - start;
26+
BigInteger result = BigInteger.valueOf(1 + tempLength).multiply(BigInteger.valueOf(tempLength)).divide(BigInteger.valueOf(2));
27+
count = count.add(result);
28+
}
29+
return count.mod(new BigInteger("1000000007")).intValue();
30+
}
31+
}
32+
33+
class Test {
34+
public static void main(String[] args) {
35+
int i = new Solution().numSub("0110111");
36+
System.out.println(i);
37+
}
38+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。
2+
3+
如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。
4+
5+
请你计算 最多 能喝到多少瓶酒。
6+
7+
8+
9+
示例 1:
10+
11+
12+
13+
输入:numBottles = 9, numExchange = 3
14+
输出:13
15+
解释:你可以用 3 个空酒瓶兑换 1 瓶酒。
16+
所以最多能喝到 9 + 3 + 1 = 13 瓶酒。
17+
示例 2:
18+
19+
20+
21+
输入:numBottles = 15, numExchange = 4
22+
输出:19
23+
解释:你可以用 4 个空酒瓶兑换 1 瓶酒。
24+
所以最多能喝到 15 + 3 + 1 = 19 瓶酒。
25+
示例 3:
26+
27+
输入:numBottles = 5, numExchange = 5
28+
输出:6
29+
示例 4:
30+
31+
输入:numBottles = 2, numExchange = 3
32+
输出:2
33+
34+
35+
提示:
36+
37+
1 <= numBottles <= 100
38+
2 <= numExchange <= 100

0 commit comments

Comments
 (0)