Merge remote-tracking branch 'origin/master'

This commit is contained in:
轩辕龙儿 2022-04-23 14:55:59 +08:00
commit 2ab1e255b1
56 changed files with 3175 additions and 0 deletions

View File

@ -0,0 +1,88 @@
//<p>给定两个字符串形式的非负整数&nbsp;<code>num1</code> <code>num2</code>&nbsp;计算它们的和并同样以字符串形式返回</p>
//
//<p>你不能使用任何內建的用于处理大整数的库比如 <code>BigInteger</code>&nbsp;也不能直接将输入的字符串转换为整数形式</p>
//
//<p>&nbsp;</p>
//
//<p><strong>示例 1</strong></p>
//
//<pre>
//<strong>输入</strong>num1 = "11", num2 = "123"
//<strong>输出</strong>"134"
//</pre>
//
//<p><strong>示例 2</strong></p>
//
//<pre>
//<strong>输入</strong>num1 = "456", num2 = "77"
//<strong>输出</strong>"533"
//</pre>
//
//<p><strong>示例 3</strong></p>
//
//<pre>
//<strong>输入</strong>num1 = "0", num2 = "0"
//<strong>输出</strong>"0"
//</pre>
//
//<p>&nbsp;</p>
//
//<p>&nbsp;</p>
//
//<p><strong>提示</strong></p>
//
//<ul>
// <li><code>1 &lt;= num1.length, num2.length &lt;= 10<sup>4</sup></code></li>
// <li><code>num1</code> <code>num2</code> 都只包含数字&nbsp;<code>0-9</code></li>
// <li><code>num1</code> <code>num2</code> 都不包含任何前导零</li>
//</ul>
//<div><div>Related Topics</div><div><li>数学</li><li>字符串</li><li>模拟</li></div></div><br><div><li>👍 541</li><li>👎 0</li></div>
package leetcode.editor.cn;
/**
* Classname ${NAME}
* Description 415:字符串相加
* Date ${DATE} ${TIME}
* author ${USER}
*/
public class AddStrings {
public static void main(String[] args) {
Solution solution = new AddStrings().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder str = new StringBuilder();
StringBuilder sb1 = new StringBuilder(num1);
StringBuilder sb2 = new StringBuilder(num2);
sb1.reverse();
sb2.reverse();
int index = 0;
int sum = 0;
while (index < sb1.length() || index < sb2.length()) {
if (index < sb1.length()) {
sum += (sb1.charAt(index) - '0');
}
if (index < sb2.length()) {
sum += (sb2.charAt(index) - '0');
}
if (sum >= 10) {
str.insert(0, (sum % 10));
sum /= 10;
} else {
str.insert(0, sum);
sum = 0;
}
index++;
}
if (sum > 0) {
str.insert(0, sum);
}
return str.toString();
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,71 @@
//给你一个整数数组 salary 数组里每个数都是 唯一 其中 salary[i] 是第 i 个员工的工资
//
// 请你返回去掉最低工资和最高工资以后剩下员工工资的平均值
//
//
//
// 示例 1
//
// 输入salary = [4000,3000,1000,2000]
//输出2500.00000
//解释最低工资和最高工资分别是 1000 4000
//去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500
//
//
// 示例 2
//
// 输入salary = [1000,2000,3000]
//输出2000.00000
//解释最低工资和最高工资分别是 1000 3000
//去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000
//
//
// 示例 3
//
// 输入salary = [6000,5000,4000,3000,2000,1000]
//输出3500.00000
//
//
// 示例 4
//
// 输入salary = [8000,9000,2000,3000,6000,1000]
//输出4750.00000
//
//
//
//
// 提示
//
//
// 3 <= salary.length <= 100
// 10^3 <= salary[i] <= 10^6
// salary[i] 是唯一的
// 与真实值误差在 10^-5 以内的结果都将视为正确答案
//
// Related Topics 数组 排序 👍 33 👎 0
package leetcode.editor.cn;
import java.util.Arrays;
//1491:去掉最低工资和最高工资后的工资平均值
public class AverageSalaryExcludingTheMinimumAndMaximumSalary {
public static void main(String[] args) {
Solution solution = new AverageSalaryExcludingTheMinimumAndMaximumSalary().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public double average(int[] salary) {
Arrays.sort(salary);
double avg = 0d;
for (int i = 1; i < salary.length - 1; i++) {
avg += salary[i];
}
return avg / (salary.length - 2);
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,118 @@
//二进制手表顶部有 4 LED 代表 小时0-11底部的 6 LED 代表 分钟0-59每个 LED 代表一个 0 1最低位在右侧
//
//
//
// 例如下面的二进制手表读取 "3:25"
//
//
//
//
// 图源WikiMedia - Binary clock samui moon.jpg 许可协议Attribution-ShareAlike 3.0
//Unported (CC BY-SA 3.0)
//
// 给你一个整数 turnedOn 表示当前亮着的 LED 的数量返回二进制手表可以表示的所有可能时间你可以 按任意顺序 返回答案
//
// 小时不会以零开头
//
//
// 例如"01:00" 是无效的时间正确的写法应该是 "1:00"
//
//
// 分钟必须由两位数组成可能会以零开头
//
//
// 例如"10:2" 是无效的时间正确的写法应该是 "10:02"
//
//
//
//
// 示例 1
//
//
//输入turnedOn = 1
//输出["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
//
//
// 示例 2
//
//
//输入turnedOn = 9
//输出[]
//
//
//
//
// 提示
//
//
// 0 <= turnedOn <= 10
//
// Related Topics 位运算 回溯 👍 356 👎 0
package leetcode.editor.cn;
import java.util.*;
//401:二进制手表
public class BinaryWatch {
public static void main(String[] args) {
Solution solution = new BinaryWatch().new Solution();
// TO TEST
System.out.println(solution.readBinaryWatch(2));
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public List<String> readBinaryWatch(int turnedOn) {
if (turnedOn > 8) {
return new ArrayList<>();
}
Map<Integer, Set<Integer>> map1 = getNums(4, turnedOn);
Map<Integer, Set<Integer>> map2 = getNums(6, turnedOn);
List<String> list = new ArrayList<>();
for (int key : map1.keySet()) {
if (turnedOn - key >= 6) {
continue;
}
for (int hour : map1.get(key)) {
for (int mini : map2.get(turnedOn - key)) {
list.add(hour + ":" + String.format("%02d", mini));
}
}
}
return list;
}
private Map<Integer, Set<Integer>> getNums(int line, int turnedOn) {
Map<Integer, Set<Integer>> map = new HashMap<>(line);
int[] arrs = new int[line];
arrs[0] = 1;
for (int i = 1; i < line; i++) {
arrs[i] = 2 * arrs[i - 1];
}
for (int i = 0; i <= Math.min(line, turnedOn); i++) {
if (i == 0) {
map.put(i, new HashSet<>(Collections.singletonList(0)));
} else {
Set<Integer> set = map.get(i - 1);
Set<Integer> cur = new HashSet<>();
for (int num : set) {
for (int j = 0; j < line; j++) {
if ((num & arrs[j]) == 0) {
if (line == 4 && (num | arrs[j]) < 12) {
cur.add(num | arrs[j]);
} else if (line == 6 && (num | arrs[j]) < 60) {
cur.add(num | arrs[j]);
}
}
}
}
map.put(i, cur);
}
}
return map;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,63 @@
//<p>给你一个数字数组 <code>arr</code> </p>
//
//<p>如果一个数列中任意相邻两项的差总等于同一个常数那么这个数列就称为 <strong>等差数列</strong> </p>
//
//<p>如果可以重新排列数组形成等差数列请返回 <code>true</code> 否则返回 <code>false</code> </p>
//
//<p>&nbsp;</p>
//
//<p><strong>示例 1</strong></p>
//
//<pre><strong>输入</strong>arr = [3,5,1]
//<strong>输出</strong>true
//<strong>解释</strong>对数组重新排序得到 [1,3,5] 或者 [5,3,1] 任意相邻两项的差分别为 2 -2 可以形成等差数列
//</pre>
//
//<p><strong>示例 2</strong></p>
//
//<pre><strong>输入</strong>arr = [1,2,4]
//<strong>输出</strong>false
//<strong>解释</strong>无法通过重新排序得到等差数列
//</pre>
//
//<p>&nbsp;</p>
//
//<p><strong>提示</strong></p>
//
//<ul>
// <li><code>2 &lt;= arr.length &lt;= 1000</code></li>
// <li><code>-10^6 &lt;= arr[i] &lt;= 10^6</code></li>
//</ul>
//<div><div>Related Topics</div><div><li>数组</li><li>排序</li></div></div><br><div><li>👍 23</li><li>👎 0</li></div>
package leetcode.editor.cn;
import java.util.Arrays;
/**
* Classname ${NAME}
* Description 1502:判断能否形成等差数列
* Date ${DATE} ${TIME}
* author ${USER}
*/
public class CanMakeArithmeticProgressionFromSequence {
public static void main(String[] args) {
Solution solution = new CanMakeArithmeticProgressionFromSequence().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean canMakeArithmeticProgression(int[] arr) {
Arrays.sort(arr);
int sub = arr[1] - arr[0];
for (int i = 2; i < arr.length; i++) {
if (arr[i] - arr[i - 1] != sub) {
return false;
}
}
return true;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,92 @@
//<p>给你长度相等的两个字符串 <code>s1</code> <code>s2</code> 一次<strong> 字符串交换 </strong>操作的步骤如下选出某个字符串中的两个下标不必不同并交换这两个下标所对应的字符</p>
//
//<p>如果对 <strong>其中一个字符串</strong> 执行 <strong>最多一次字符串交换</strong> 就可以使两个字符串相等返回 <code>true</code> 否则返回 <code>false</code> </p>
//
//<p> </p>
//
//<p><strong>示例 1</strong></p>
//
//<pre><strong>输入</strong>s1 = "bank", s2 = "kanb"
//<strong>输出</strong>true
//<strong>解释</strong>例如交换 s2 中的第一个和最后一个字符可以得到 "bank"
//</pre>
//
//<p><strong>示例 2</strong></p>
//
//<pre><strong>输入</strong>s1 = "attack", s2 = "defend"
//<strong>输出</strong>false
//<strong>解释</strong>一次字符串交换无法使两个字符串相等
//</pre>
//
//<p><strong>示例 3</strong></p>
//
//<pre><strong>输入</strong>s1 = "kelb", s2 = "kelb"
//<strong>输出</strong>true
//<strong>解释</strong>两个字符串已经相等所以不需要进行字符串交换
//</pre>
//
//<p><strong>示例 4</strong></p>
//
//<pre><strong>输入</strong>s1 = "abcd", s2 = "dcba"
//<strong>输出</strong>false
//</pre>
//
//<p> </p>
//
//<p><strong>提示</strong></p>
//
//<ul>
// <li><code>1 &lt;= s1.length, s2.length &lt;= 100</code></li>
// <li><code>s1.length == s2.length</code></li>
// <li><code>s1</code> <code>s2</code> 仅由小写英文字母组成</li>
//</ul>
//<div><div>Related Topics</div><div><li>哈希表</li><li>字符串</li><li>计数</li></div></div><br><div><li>👍 29</li><li>👎 0</li></div>
package leetcode.editor.cn;
import java.util.ArrayList;
import java.util.List;
/**
* Classname ${NAME}
* Description 1790:仅执行一次字符串交换能否使两个字符串相等
* Date ${DATE} ${TIME}
* author ${USER}
*/
public class CheckIfOneStringSwapCanMakeStringsEqual {
public static void main(String[] args) {
Solution solution = new CheckIfOneStringSwapCanMakeStringsEqual().new Solution();
// TO TEST
System.out.println(solution.areAlmostEqual("bank", "kanb"));
System.out.println(solution.areAlmostEqual("attack", "defend"));
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean areAlmostEqual(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
if (s1.equals(s2)) {
return true;
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) != s2.charAt(i)) {
if (list.size() == 1) {
int index = list.get(0);
s1 = s1.substring(0, index)
+ s1.charAt(i)
+ s1.substring(index + 1, i)
+ s1.charAt(index)
+ s1.substring(i + 1);
return s1.equals(s2);
}
list.add(i);
}
}
return list.size() == 0;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,80 @@
//给定一个不为空的二叉搜索树和一个目标值 target请在该二叉搜索树中找到最接近目标值 target 的数值
//
// 注意
//
//
// 给定的目标值 target 是一个浮点数
// 题目保证在该二叉搜索树中只会存在一个最接近目标值的数
//
//
// 示例
//
// 输入: root = [4,2,5,1,3]目标值 target = 3.714286
//
// 4
// / \
// 2 5
// / \
//1 3
//
//输出: 4
//
// Related Topics 深度优先搜索 二叉搜索树 二分查找 二叉树 👍 112 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.TreeNode;
//270:最接近的二叉搜索树值
public class ClosestBinarySearchTreeValue {
public static void main(String[] args) {
Solution solution = new ClosestBinarySearchTreeValue().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int closestValue(TreeNode root, double target) {
double left = target;
double right = target;
float diff = 1e-6f;
while (root != null) {
if (Math.abs(root.val - target) < diff) {
return root.val;
}
if (root.val > target) {
right = root.val;
root = root.left;
} else {
left = root.val;
root = root.right;
}
}
if (Math.abs(left - target) < diff) {
return (int) right;
} else if (Math.abs(right - target) < diff) {
return (int) left;
} else {
return target - left > right - target ? (int) right : (int) left;
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,63 @@
//给你一个整数 n 统计并返回各位数字都不同的数字 x 的个数其中 0 <= x < 10ⁿ
//
//
//
//
// 示例 1
//
//
//输入n = 2
//输出91
//解释答案应为除去 112233445566778899 0 x < 100 范围内的所有数字
//
//
// 示例 2
//
//
//输入n = 0
//输出1
//
//
//
//
//
//
// 提示
//
//
// 0 <= n <= 8
//
// Related Topics 数学 动态规划 回溯 👍 217 👎 0
package leetcode.editor.cn;
//357:统计各位数字都不同的数字个数
public class CountNumbersWithUniqueDigits {
public static void main(String[] args) {
Solution solution = new CountNumbersWithUniqueDigits().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int countNumbersWithUniqueDigits(int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return 10;
}
int sub = 9;
int count = 10;
int mul = 9;
for (int i = 2; i <= n; i++) {
count += mul * sub;
mul *= sub;
sub--;
}
return count;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,43 @@
//给你两个非负整数 low high 请你返回 low high 之间包括二者奇数的数目
//
//
//
// 示例 1
//
// 输入low = 3, high = 7
//输出3
//解释3 7 之间奇数数字为 [3,5,7]
//
// 示例 2
//
// 输入low = 8, high = 10
//输出1
//解释8 10 之间奇数数字为 [9]
//
//
//
// 提示
//
//
// 0 <= low <= high <= 10^9
//
// Related Topics 数学 👍 48 👎 0
package leetcode.editor.cn;
//1523:在区间范围内统计奇数数目
public class CountOddNumbersInAnIntervalRange {
public static void main(String[] args) {
Solution solution = new CountOddNumbersInAnIntervalRange().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int countOdds(int low, int high) {
return (high + 1) / 2 - (low) / 2;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,111 @@
//给定整数 n 返回 所有小于非负整数 n 的质数的数量
//
//
//
// 示例 1
//
//
//输入n = 10
//输出4
//解释小于 10 的质数一共有 4 , 它们是 2, 3, 5, 7
//
//
// 示例 2
//
//
//输入n = 0
//输出0
//
//
// 示例 3
//
//
//输入n = 1
//输出0
//
//
//
//
// 提示
//
//
// 0 <= n <= 5 * 10
//
// Related Topics 数组 数学 枚举 数论 👍 869 👎 0
package leetcode.editor.cn;
import java.util.Arrays;
//204:计数质数
public class CountPrimes {
public static void main(String[] args) {
Solution solution = new CountPrimes().new Solution();
// TO TEST
solution.countPrimes(499979);
}
//class Solution {
// public int countPrimes(int n) {
// if (n <= 2) {
// return 0;
// }
// int count = 1;
// for (int i = 3; i < n; i++) {
// if (isPrime(i)) {
// count++;
// }
// }
// return count;
// }
// /**
// * 判断是否是质数
// *
// * @param num 数字
// * @return true质数false不是质数
// */
// private boolean isPrime(int num) {
// if (num < 2) {
// return false;
// }
// if (num == 2) {
// return true;
// }
// for (int i = 2; i * i <= num; i++) {
// if (num % i == 0) {
// return false;
// }
// }
// return true;
// }
//}
class Solution {
public int countPrimes(int n) {
if (n <= 2) {
return 0;
}
boolean[] nums = new boolean[n + 1];
Arrays.fill(nums, true);
nums[0] = false;
nums[1] = false;
int count = 0;
int max = (int) Math.sqrt(n);
for (int i = 2; i < n; i++) {
if (nums[i]) {
count++;
if (i > max) {
continue;
}
for (int j = i; j * i < n; j++) {
nums[j * i] = false;
}
}
}
return count;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,74 @@
//给你一个整数 n 对于 0 <= i <= n 中的每个 i 计算其二进制表示中 1 的个数 返回一个长度为 n + 1 的数组 ans 作为答案
//
//
//
//
//
//
// 示例 1
//
//
//输入n = 2
//输出[0,1,1]
//解释
//0 --> 0
//1 --> 1
//2 --> 10
//
//
// 示例 2
//
//
//输入n = 5
//输出[0,1,1,2,1,2]
//解释
//0 --> 0
//1 --> 1
//2 --> 10
//3 --> 11
//4 --> 100
//5 --> 101
//
//
//
//
// 提示
//
//
// 0 <= n <= 10
//
//
//
//
// 进阶
//
//
// 很容易就能实现时间复杂度为 O(n log n) 的解决方案你可以在线性时间复杂度 O(n) 内用一趟扫描解决此问题吗
// 你能不使用任何内置函数解决此问题吗C++ 中的 __builtin_popcount
//
//
//
// Related Topics 位运算 动态规划 👍 967 👎 0
package leetcode.editor.cn;
//338:比特位计数
public class CountingBits {
public static void main(String[] args) {
Solution solution = new CountingBits().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int[] countBits(int n) {
int[] arrs = new int[n+1];
for (int i = 0; i <= n; i++) {
arrs[i] = Integer.bitCount(i);
}
return arrs;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,82 @@
//给你两个整数 x y 表示你在一个笛卡尔坐标系下的 (x, y) 同时在同一个坐标系下给你一个数组 points 其中 points[i] =
// [ai, bi] 表示在 (ai, bi) 处有一个点当一个点与你所在的位置有相同的 x 坐标或者相同的 y 坐标时我们称这个点是 有效的
//
// 请返回距离你当前位置 曼哈顿距离 最近的 有效 点的下标下标从 0 开始如果有多个最近的有效点请返回下标 最小 的一个如果没有有效点请返回 -
//1
//
// 两个点 (x1, y1) (x2, y2) 之间的 曼哈顿距离 abs(x1 - x2) + abs(y1 - y2)
//
//
//
// 示例 1
//
//
//输入x = 3, y = 4, points = [[1,2],[3,1],[2,4],[2,3],[4,4]]
//输出2
//解释所有点中[3,1][2,4] [4,4] 是有效点有效点中[2,4] [4,4] 距离你当前位置的曼哈顿距离最小都为 1 [2,4
//] 的下标最小所以返回 2
//
// 示例 2
//
//
//输入x = 3, y = 4, points = [[3,4]]
//输出0
//提示答案可以与你当前所在位置坐标相同
//
// 示例 3
//
//
//输入x = 3, y = 4, points = [[2,3]]
//输出-1
//解释没有 有效点
//
//
//
// 提示
//
//
// 1 <= points.length <= 10
// points[i].length == 2
// 1 <= x, y, ai, bi <= 10
//
// Related Topics 数组 👍 26 👎 0
package leetcode.editor.cn;
//1779:找到最近的有相同 X Y 坐标的点
public class FindNearestPointThatHasTheSameXOrYCoordinate {
public static void main(String[] args) {
Solution solution = new FindNearestPointThatHasTheSameXOrYCoordinate().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int nearestValidPoint(int x, int y, int[][] points) {
int index = -1;
int minDistance = Integer.MAX_VALUE;
for (int i = 0; i < points.length; i++) {
//边界1坐标与xy相同直接返回下标
if ((points[i][0] == x) && (points[i][1] == y)) {
return i;
}
//边界2坐标与xy都不相同直接进入下一循环不参与distance计算
if ((points[i][0] != x) && (points[i][1] != y)) {
continue;
}
//若坐标中只有一个值与x or y匹配
if ((points[i][0] == x) || (points[i][1] == y)) {
int distance = Math.abs(points[i][0] - x) + Math.abs(points[i][1] - y);
if (distance < minDistance) {
minDistance = distance;
index = i;
}
}
}
return index;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,101 @@
//给你一个整数数组 digits 其中每个元素是一个数字0 - 9数组中可能存在重复元素
//
// 你需要找出 所有 满足下述条件且 互不相同 的整数
//
//
// 该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成
// 该整数不含 前导零
// 该整数是一个 偶数
//
//
// 例如给定的 digits [1, 2, 3] 整数 132 312 满足上面列出的全部条件
//
// 将找出的所有互不相同的整数按 递增顺序 排列并以数组形式返回
//
//
//
// 示例 1
//
//
//输入digits = [2,1,3,0]
//输出[102,120,130,132,210,230,302,310,312,320]
//解释
//所有满足题目条件的整数都在输出数组中列出
//注意答案数组中不含有 奇数 或带 前导零 的整数
//
// 示例 2
//
//
//输入digits = [2,2,8,8,2]
//输出[222,228,282,288,822,828,882]
//解释
//同样的数字0 - 9在构造整数时可以重复多次重复次数最多与其在 digits 中出现的次数一样
//在这个例子中数字 8 在构造 288828 882 时都重复了两次
//
//
// 示例 3
//
//
//输入digits = [3,7,5]
//输出[]
//解释
//使用给定的 digits 无法构造偶数
//
//
//
//
// 提示
//
//
// 3 <= digits.length <= 100
// 0 <= digits[i] <= 9
//
// Related Topics 数组 哈希表 枚举 排序 👍 16 👎 0
package leetcode.editor.cn;
import java.util.*;
//2094:找出 3 位偶数
public class Finding3DigitEvenNumbers {
public static void main(String[] args) {
Solution solution = new Finding3DigitEvenNumbers().new Solution();
// TO TEST
solution.findEvenNumbers(new int[]{2, 1, 3, 0});
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int[] findEvenNumbers(int[] digits) {
Set<Integer> set = new HashSet<>();
int len = digits.length;
for (int i = 0; i < len; i++) {
if (digits[i] == 0) {
continue;
}
for (int j = 0; j < len; j++) {
if (j == i) {
continue;
}
for (int k = 0; k < len; k++) {
if (k == i || k == j || digits[k] % 2 != 0) {
continue;
}
int num = digits[i] * 100 + digits[j] * 10 + digits[k];
set.add(num);
}
}
}
int size = set.size();
int[] res = new int[size];
int index = 0;
for (int num : set) {
res[index++] = num;
}
Arrays.sort(res);
return res;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,61 @@
//你和朋友玩一个叫做翻转游戏的游戏游戏规则如下
//
// 给你一个字符串 currentState 其中只含 '+' '-' 你和朋友轮流将 连续 的两个 "++" 反转成 "--" 当一方无法进行有效
//的翻转时便意味着游戏结束则另一方获胜
//
// 计算并返回 一次有效操作 字符串 currentState 所有的可能状态返回结果可以按 任意顺序 排列如果不存在可能的有效操作请返回一个空列表
// []
//
//
//
// 示例 1
//
//
//输入currentState = "++++"
//输出["--++","+--+","++--"]
//
//
// 示例 2
//
//
//输入currentState = "+"
//输出[]
//
//
//
//
// 提示
//
//
// 1 <= currentState.length <= 500
// currentState[i] 不是 '+' 就是 '-'
//
// Related Topics 字符串 👍 33 👎 0
package leetcode.editor.cn;
import java.util.ArrayList;
import java.util.List;
//293:翻转游戏
public class FlipGame {
public static void main(String[] args) {
Solution solution = new FlipGame().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public List<String> generatePossibleNextMoves(String currentState) {
List<String> list = new ArrayList<>();
for (int i = 1; i < currentState.length(); i++) {
if(currentState.charAt(i-1)=='+'&&currentState.charAt(i)=='+'){
list.add(currentState.substring(0,i-1)+"--"+currentState.substring(i+1));
}
}
return list;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,67 @@
//<p>给你一个整数 <code>n</code> 按字典序返回范围 <code>[1, n]</code> 内所有整数</p>
//
//<p>你必须设计一个时间复杂度为 <code>O(n)</code> 且使用 <code>O(1)</code> 额外空间的算法</p>
//
//<p>&nbsp;</p>
//
//<p><strong>示例 1</strong></p>
//
//<pre>
//<strong>输入</strong>n = 13
//<strong>输出</strong>[1,10,11,12,13,2,3,4,5,6,7,8,9]
//</pre>
//
//<p><strong>示例 2</strong></p>
//
//<pre>
//<strong>输入</strong>n = 2
//<strong>输出</strong>[1,2]
//</pre>
//
//<p>&nbsp;</p>
//
//<p><strong>提示</strong></p>
//
//<ul>
// <li><code>1 &lt;= n &lt;= 5 * 10<sup>4</sup></code></li>
//</ul>
//<div><div>Related Topics</div><div><li>深度优先搜索</li><li>字典树</li></div></div><br><div><li>👍 277</li><li>👎 0</li></div>
package leetcode.editor.cn;
import java.util.ArrayList;
import java.util.List;
// 386:字典序排数
public class LexicographicalNumbers {
public static void main(String[] args) {
Solution solution = new LexicographicalNumbers().new Solution();
// TO TEST
solution.lexicalOrder(13);
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public List<Integer> lexicalOrder(int n) {
dfs(n, 1);
return list;
}
List<Integer> list = new ArrayList<>();
private void dfs(int n, int num) {
if (num > n) {
return;
}
list.add(num);
dfs(n, num * 10);
if (num % 10 == 0 || num == 1) {
int max = (num / 10 + 1) * 10;
for (int i = num + 1; i < max; i++) {
dfs(n, i);
}
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,94 @@
//请你设计一个日志系统可以流式接收消息以及它的时间戳每条 不重复 的消息最多只能每 10 秒打印一次也就是说如果在时间戳 t 打印某条消息那么相同内
//容的消息直到时间戳变为 t + 10 之前都不会被打印
//
// 所有消息都按时间顺序发送多条消息可能到达同一时间戳
//
// 实现 Logger
//
//
// Logger() 初始化 logger 对象
// bool shouldPrintMessage(int timestamp, string message) 如果这条消息 message 在给定的时间戳
// timestamp 应该被打印出来则返回 true 否则请返回 false
//
//
//
//
// 示例
//
//
//输入
//["Logger", "shouldPrintMessage", "shouldPrintMessage", "shouldPrintMessage",
//"shouldPrintMessage", "shouldPrintMessage", "shouldPrintMessage"]
//[[], [1, "foo"], [2, "bar"], [3, "foo"], [8, "bar"], [10, "foo"], [11, "foo"]]
//
//输出
//[null, true, true, false, false, false, true]
//
//解释
//Logger logger = new Logger();
//logger.shouldPrintMessage(1, "foo"); // 返回 true 下一次 "foo" 可以打印的时间戳是 1 + 10 =
// 11
//logger.shouldPrintMessage(2, "bar"); // 返回 true 下一次 "bar" 可以打印的时间戳是 2 + 10 =
// 12
//logger.shouldPrintMessage(3, "foo"); // 3 < 11 返回 false
//logger.shouldPrintMessage(8, "bar"); // 8 < 12 返回 false
//logger.shouldPrintMessage(10, "foo"); // 10 < 11 返回 false
//logger.shouldPrintMessage(11, "foo"); // 11 >= 11 返回 true 下一次 "foo" 可以打印的时间戳
// 11 + 10 = 21
//
//
//
//
// 提示
//
//
// 0 <= timestamp <= 10
// 每个 timestamp 都将按非递减顺序时间顺序传递
// 1 <= message.length <= 30
// 最多调用 10 shouldPrintMessage 方法
//
// Related Topics 设计 哈希表 👍 62 👎 0
package leetcode.editor.cn;
import java.util.HashMap;
import java.util.Map;
//359:日志速率限制器
public class LoggerRateLimiter {
public static void main(String[] args) {
//Solution solution = new LoggerRateLimiter().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Logger {
Map<String,Integer> map;
public Logger() {
map = new HashMap<>();
}
public boolean shouldPrintMessage(int timestamp, String message) {
if(map.containsKey(message)){
if(map.get(message)+10<=timestamp){
map.put(message,timestamp);
return true;
}else{
return false;
}
}else{
map.put(message,timestamp);
return true;
}
}
}
/**
* Your Logger object will be instantiated and called as such:
* Logger obj = new Logger();
* boolean param_1 = obj.shouldPrintMessage(timestamp,message);
*/
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,57 @@
//给定一个会议时间安排的数组 intervals 每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] 请你判
//断一个人是否能够参加这里面的全部会议
//
//
//
// 示例 1
//
//
//输入intervals = [[0,30],[5,10],[15,20]]
//输出false
//
//
// 示例 2
//
//
//输入intervals = [[7,10],[2,4]]
//输出true
//
//
//
//
// 提示
//
//
// 0 <= intervals.length <= 10
// intervals[i].length == 2
// 0 <= starti < endi <= 10
//
// Related Topics 数组 排序 👍 117 👎 0
package leetcode.editor.cn;
import java.util.Arrays;
import java.util.Comparator;
//252:会议室
public class MeetingRooms {
public static void main(String[] args) {
Solution solution = new MeetingRooms().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean canAttendMeetings(int[][] intervals) {
Arrays.sort(intervals, Comparator.comparingInt(e -> e[0]));
for (int i = 1; i < intervals.length; i++) {
if(intervals[i][0]<intervals[i-1][1]){
return false;
}
}
return true;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,71 @@
//给你两个字符串 current correct 表示两个 24 小时制时间
//
// 24 小时制时间 "HH:MM" 进行格式化其中 HH 00 23 之间 MM 00 59 之间最早的 24 小时制时间为 0
//0:00 最晚的是 23:59
//
// 在一步操作中你可以将 current 这个时间增加 1515 60 分钟你可以执行这一操作 任意 次数
//
// 返回将 current 转化为 correct 需要的 最少操作数
//
//
//
// 示例 1
//
// 输入current = "02:30", correct = "04:35"
//输出3
//解释
//可以按下述 3 步操作将 current 转换为 correct
//- current 60 分钟current 变为 "03:30"
//- current 60 分钟current 变为 "04:30"
//- current 5 分钟current 变为 "04:35"
//可以证明无法用少于 3 步操作将 current 转化为 correct
//
// 示例 2
//
// 输入current = "11:00", correct = "11:01"
//输出1
//解释只需要为 current 加一分钟所以最小操作数是 1
//
//
//
//
// 提示
//
//
// current correct 都符合 "HH:MM" 格式
// current <= correct
//
// Related Topics 贪心 字符串 👍 7 👎 0
package leetcode.editor.cn;
//2224:转化时间需要的最少操作数
public class MinimumNumberOfOperationsToConvertTime {
public static void main(String[] args) {
Solution solution = new MinimumNumberOfOperationsToConvertTime().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int convertTime(String current, String correct) {
String strs1[] = current.split(":");
String strs2[] = correct.split(":");
int sum = Integer.parseInt(strs2[0]) * 60
+ Integer.parseInt(strs2[1])
- Integer.parseInt(strs1[0]) * 60
- Integer.parseInt(strs1[1]);
int count = 0;
int[] arrs = new int[]{60, 15, 5, 1};
for (int arr : arrs) {
if (sum >= arr) {
count += sum / arr;
sum %= arr;
}
}
return count;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,71 @@
//我们要把给定的字符串 S 从左到右写到每一行上每一行的最大宽度为100个单位如果我们在写某个字母的时候会使这行超过了100 个单位那么我们应该把这个字
//母写到下一行我们给定了一个数组 widths 这个数组 widths[0] 代表 'a' 需要的单位 widths[1] 代表 'b' 需要的单位...
// widths[25] 代表 'z' 需要的单位
//
// 现在回答两个问题至少多少行能放下S以及最后一行使用的宽度是多少个单位将你的答案作为长度为2的整数列表返回
//
//
//示例 1:
//输入:
//widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
//,10,10,10]
//S = "abcdefghijklmnopqrstuvwxyz"
//输出: [3, 60]
//解释:
//所有的字符拥有相同的占用单位10所以书写所有的26个字母
//我们需要2个整行和占用60个单位的一行
//
//
//
//示例 2:
//输入:
//widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
//10,10,10]
//S = "bbbcccdddaaa"
//输出: [2, 4]
//解释:
//除去字母'a'所有的字符都是相同的单位10并且字符串 "bbbcccdddaa" 将会覆盖 9 * 10 + 2 * 4 = 98 个单位.
//最后一个字母 'a' 将会被写到第二行因为第一行只剩下2个单位了
//所以这个答案是2行第二行有4个单位宽度
//
//
//
//
// :
//
//
// 字符串 S 的长度在 [1, 1000] 的范围
// S 只包含小写字母
// widths 是长度为 26的数组
// widths[i] 值的范围在 [2, 10]
//
// Related Topics 数组 字符串 👍 69 👎 0
package leetcode.editor.cn;
//806:写字符串需要的行数
public class NumberOfLinesToWriteString {
public static void main(String[] args) {
Solution solution = new NumberOfLinesToWriteString().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int[] numberOfLines(int[] widths, String s) {
int[] arrs = new int[]{1,0};
int sum = 0;
for(char ch:s.toCharArray()){
sum+=widths[ch-'a'];
if(sum>100){
arrs[0]++;
sum = widths[ch-'a'];
}
}
arrs[1] = sum;
return arrs;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,49 @@
//给定一个字符串判断该字符串中是否可以通过重新排列组合形成一个回文字符串
//
// 示例 1
//
// 输入: "code"
//输出: false
//
// 示例 2
//
// 输入: "aab"
//输出: true
//
// 示例 3
//
// 输入: "carerac"
//输出: true
// Related Topics 位运算 哈希表 字符串 👍 59 👎 0
package leetcode.editor.cn;
//266:回文排列
public class PalindromePermutation {
public static void main(String[] args) {
Solution solution = new PalindromePermutation().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean canPermutePalindrome(String s) {
int[] arrs = new int[26];
for (char ch : s.toCharArray()) {
arrs[ch - 'a']++;
}
int count = 0;
for (int i = 0; i < 26; i++) {
if (arrs[i] % 2 == 1) {
if (count == 1) {
return false;
}
count++;
}
}
return true;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,80 @@
//给定一个整数数组 nums处理以下类型的多个查询:
//
//
// 计算索引 left right 包含 left right之间的 nums 元素的 其中 left <= right
//
//
// 实现 NumArray
//
//
// NumArray(int[] nums) 使用数组 nums 初始化对象
// int sumRange(int i, int j) 返回数组 nums 中索引 left right 之间的元素的 总和 包含 left
//right 两点也就是 nums[left] + nums[left + 1] + ... + nums[right] )
//
//
//
//
// 示例 1
//
//
//输入
//["NumArray", "sumRange", "sumRange", "sumRange"]
//[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
//输出
//[null, 1, -1, -3]
//
//解释
//NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
//numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
//numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
//numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
//
//
//
//
// 提示
//
//
// 1 <= nums.length <= 10
// -10 <= nums[i] <= 10
// 0 <= i <= j < nums.length
// 最多调用 10 sumRange 方法
//
// Related Topics 设计 数组 前缀和 👍 443 👎 0
package leetcode.editor.cn;
//303:区域和检索 - 数组不可变
public class RangeSumQueryImmutable {
public static void main(String[] args) {
//Solution solution = new RangeSumQueryImmutable().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class NumArray {
int[] nums;
int[] sums;
public NumArray(int[] nums) {
this.nums = nums;
sums = new int[nums.length + 1];
for (int i = 0; i < nums.length; i++) {
sums[i + 1] = sums[i] + nums[i];
}
}
public int sumRange(int left, int right) {
return sums[right + 1] - sums[left];
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(left,right);
*/
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,66 @@
//<p>给定一个非空的字符串<meta charset="UTF-8" />&nbsp;<code>s</code>&nbsp;检查是否可以通过由它的一个子串重复多次构成</p>
//
//<p>&nbsp;</p>
//
//<p><strong>示例 1:</strong></p>
//
//<pre>
//<strong>输入:</strong> s = "abab"
//<strong>输出:</strong> true
//<strong>解释:</strong> 可由子串 "ab" 重复两次构成
//</pre>
//
//<p><strong>示例 2:</strong></p>
//
//<pre>
//<strong>输入:</strong> s = "aba"
//<strong>输出:</strong> false
//</pre>
//
//<p><strong>示例 3:</strong></p>
//
//<pre>
//<strong>输入:</strong> s = "abcabcabcabc"
//<strong>输出:</strong> true
//<strong>解释:</strong> 可由子串 "abc" 重复四次构成 (或子串 "abcabc" 重复两次构成)
//</pre>
//
//<p>&nbsp;</p>
//
//<p><b>提示</b></p>
//
//<p><meta charset="UTF-8" /></p>
//
//<ul>
// <li><code>1 &lt;= s.length &lt;= 10<sup>4</sup></code></li>
// <li><code>s</code>&nbsp;由小写英文字母组成</li>
//</ul>
//<div><div>Related Topics</div><div><li>字符串</li><li>字符串匹配</li></div></div><br><div><li>👍 676</li><li>👎 0</li></div>
package leetcode.editor.cn;
// 459:重复的子字符串
public class RepeatedSubstringPattern {
public static void main(String[] args) {
Solution solution = new RepeatedSubstringPattern().new Solution();
// TO TEST
solution.repeatedSubstringPattern("aaaa");
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean repeatedSubstringPattern(String s) {
int lens = s.length();
for (int i = 1; i < lens; i++) {
if (lens % i == 0) {
if (s.substring(0, i).equals(s.substring(lens - i))
&& s.substring(i).equals(s.substring(0, lens - i))) {
return true;
}
}
}
return false;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,71 @@
//给你一个 m x n 的整数网格 accounts 其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量返回最富有客户所拥
//有的 资产总量
//
// 客户的 资产总量 就是他们在各家银行托管的资产数量之和最富有客户就是 资产总量 最大的客户
//
//
//
// 示例 1
//
// 输入accounts = [[1,2,3],[3,2,1]]
//输出6
//解释
// 1 位客户的资产总量 = 1 + 2 + 3 = 6
// 2 位客户的资产总量 = 3 + 2 + 1 = 6
//两位客户都是最富有的资产总量都是 6 所以返回 6
//
//
// 示例 2
//
// 输入accounts = [[1,5],[7,3],[3,5]]
//输出10
//解释
// 1 位客户的资产总量 = 6
// 2 位客户的资产总量 = 10
// 3 位客户的资产总量 = 8
// 2 位客户是最富有的资产总量是 10
//
// 示例 3
//
// 输入accounts = [[2,8,7],[7,1,3],[1,9,5]]
//输出17
//
//
//
//
// 提示
//
//
// m == accounts.length
// n == accounts[i].length
// 1 <= m, n <= 50
// 1 <= accounts[i][j] <= 100
//
// Related Topics 数组 矩阵 👍 53 👎 0
package leetcode.editor.cn;
//1672:最富有客户的资产总量
public class RichestCustomerWealth {
public static void main(String[] args) {
Solution solution = new RichestCustomerWealth().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int maximumWealth(int[][] accounts) {
int max = 0;
for (int[] account : accounts) {
int sum = 0;
for (int i : account) {
sum += i;
}
max = Math.max(max, sum);
}
return max;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,90 @@
//总计有 n 个环环的颜色可以是红绿蓝中的一种这些环分布穿在 10 根编号为 0 9 的杆上
//
// 给你一个长度为 2n 的字符串 rings 表示这 n 个环在杆上的分布rings 中每两个字符形成一个 颜色位置对 用于描述每个环
//
//
// i 对中的 第一个 字符表示第 i 个环的 颜色'R''G''B'
// i 对中的 第二个 字符表示第 i 个环的 位置也就是位于哪根杆上'0' '9'
//
//
// 例如"R3G2B1" 表示共有 n == 3 个环红色的环在编号为 3 的杆上绿色的环在编号为 2 的杆上蓝色的环在编号为 1 的杆上
//
// 找出所有集齐 全部三种颜色 环的杆并返回这种杆的数量
//
//
//
// 示例 1
//
// 输入rings = "B0B6G0R6R0R6G9"
//输出1
//解释
//- 编号 0 的杆上有 3 个环集齐全部颜色绿
//- 编号 6 的杆上有 3 个环但只有红蓝两种颜色
//- 编号 9 的杆上只有 1 个绿色环
//因此集齐全部三种颜色环的杆的数目为 1
//
//
// 示例 2
//
// 输入rings = "B0R0G0R9R0B0G0"
//输出1
//解释
//- 编号 0 的杆上有 6 个环集齐全部颜色绿
//- 编号 9 的杆上只有 1 个红色环
//因此集齐全部三种颜色环的杆的数目为 1
//
//
// 示例 3
//
// 输入rings = "G4"
//输出0
//解释
//只给了一个环因此不存在集齐全部三种颜色环的杆
//
//
//
//
// 提示
//
//
// rings.length == 2 * n
// 1 <= n <= 100
// i 偶数 rings[i] 的值可以取 'R''G' 'B'下标从 0 开始计数
// i 奇数 rings[i] 的值可以取 '0' '9' 中的一个数字下标从 0 开始计数
//
// Related Topics 哈希表 字符串 👍 13 👎 0
package leetcode.editor.cn;
//2103:环和杆
public class RingsAndRods {
public static void main(String[] args) {
Solution solution = new RingsAndRods().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int countPoints(String rings) {
int[][] arrs = new int[10][3];
for (int i = 0; i < rings.length(); i += 2) {
if (rings.charAt(i) == 'R') {
arrs[rings.charAt(i + 1) - '0'][0]++;
} else if (rings.charAt(i) == 'G') {
arrs[rings.charAt(i + 1) - '0'][1]++;
} else {
arrs[rings.charAt(i + 1) - '0'][2]++;
}
}
int count = 0;
for (int[] arr : arrs) {
if (arr[0] * arr[1] * arr[2] > 0) {
count++;
}
}
return count;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,65 @@
//给定一个字符串数组 wordDict 和两个已经存在于该数组中的不同的字符串 word1 word2 返回列表中这两个单词之间的最短距离
//
//
//
// 示例 1:
//
//
//输入: wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 =
//"coding", word2 = "practice"
//输出: 3
//
//
// 示例 2:
//
//
//输入: wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 =
//"makes", word2 = "coding"
//输出: 1
//
//
//
// 提示:
//
//
// 1 <= wordsDict.length <= 3 * 10
// 1 <= wordsDict[i].length <= 10
// wordsDict[i] 由小写英文字母组成
// word1 word2 wordsDict
// word1 != word2
//
// Related Topics 数组 字符串 👍 90 👎 0
package leetcode.editor.cn;
//243:最短单词距离
public class ShortestWordDistance {
public static void main(String[] args) {
Solution solution = new ShortestWordDistance().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int shortestDistance(String[] wordsDict, String word1, String word2) {
int[] arrs = new int[]{-1, -1};
int length = wordsDict.length;
for (int i = 0; i < wordsDict.length; i++) {
if (wordsDict[i].equals(word1)) {
arrs[0] = i;
if(arrs[1]>-1){
length = Math.min(length,arrs[0]-arrs[1]);
}
}else if (wordsDict[i].equals(word2)) {
arrs[1] = i;
if(arrs[0]>-1){
length = Math.min(length,arrs[1]-arrs[0]);
}
}
}
return length;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,78 @@
//<p>已知函数 <code>signFunc(x)</code> 将会根据 <code>x</code> 的正负返回特定值</p>
//
//<ul>
// <li>如果 <code>x</code> 是正数返回 <code>1</code> </li>
// <li>如果 <code>x</code> 是负数返回 <code>-1</code> </li>
// <li>如果 <code>x</code> 是等于 <code>0</code> 返回 <code>0</code> </li>
//</ul>
//
//<p>给你一个整数数组 <code>nums</code> <code>product</code> 为数组 <code>nums</code> 中所有元素值的乘积</p>
//
//<p>返回 <code>signFunc(product)</code> </p>
//
//<p> </p>
//
//<p><strong>示例 1</strong></p>
//
//<pre>
//<strong>输入</strong>nums = [-1,-2,-3,-4,3,2,1]
//<strong>输出</strong>1
//<strong>解释</strong>数组中所有值的乘积是 144 signFunc(144) = 1
//</pre>
//
//<p><strong>示例 2</strong></p>
//
//<pre>
//<strong>输入</strong>nums = [1,5,0,2,-3]
//<strong>输出</strong>0
//<strong>解释</strong>数组中所有值的乘积是 0 signFunc(0) = 0
//</pre>
//
//<p><strong>示例 3</strong></p>
//
//<pre>
//<strong>输入</strong>nums = [-1,1,-1,1,-1]
//<strong>输出</strong>-1
//<strong>解释</strong>数组中所有值的乘积是 -1 signFunc(-1) = -1
//</pre>
//
//<p> </p>
//
//<p><strong>提示</strong></p>
//
//<ul>
// <li><code>1 <= nums.length <= 1000</code></li>
// <li><code>-100 <= nums[i] <= 100</code></li>
//</ul>
//<div><div>Related Topics</div><div><li>数组</li><li>数学</li></div></div><br><div><li>👍 20</li><li>👎 0</li></div>
package leetcode.editor.cn;
/**
* Classname ${NAME}
* Description 1822:数组元素积的符号
* Date ${DATE} ${TIME}
* author ${USER}
*/
public class SignOfTheProductOfAnArray {
public static void main(String[] args) {
Solution solution = new SignOfTheProductOfAnArray().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int arraySign(int[] nums) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0) {
count++;
} else if (nums[i] == 0) {
return 0;
}
}
return count % 2 == 0 ? 1 : -1;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,61 @@
//给你一个整数 n请你帮忙计算并返回该整数各位数字之积各位数字之和的差
//
//
//
// 示例 1
//
// 输入n = 234
//输出15
//解释
//各位数之积 = 2 * 3 * 4 = 24
//各位数之和 = 2 + 3 + 4 = 9
//结果 = 24 - 9 = 15
//
//
// 示例 2
//
// 输入n = 4421
//输出21
//解释
//各位数之积 = 4 * 4 * 2 * 1 = 32
//各位数之和 = 4 + 4 + 2 + 1 = 11
//结果 = 32 - 11 = 21
//
//
//
//
// 提示
//
//
// 1 <= n <= 10^5
//
// Related Topics 数学 👍 81 👎 0
package leetcode.editor.cn;
//1281:整数的各位积和之差
public class SubtractTheProductAndSumOfDigitsOfAnInteger {
public static void main(String[] args) {
Solution solution = new SubtractTheProductAndSumOfDigitsOfAnInteger().new Solution();
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int subtractProductAndSum(int n) {
int sum = 0;
int mul = 1;
while (n >= 10) {
int tmp = n % 10;
sum += tmp;
mul *= tmp;
n /= 10;
}
sum += n;
mul *= n;
return mul - sum;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,66 @@
//给定一个 正整数 num 编写一个函数如果 num 是一个完全平方数则返回 true 否则返回 false
//
// 进阶不要 使用任何内置的库函数 sqrt
//
//
//
// 示例 1
//
//
//输入num = 16
//输出true
//
//
// 示例 2
//
//
//输入num = 14
//输出false
//
//
//
//
// 提示
//
//
// 1 <= num <= 2^31 - 1
//
// Related Topics 数学 二分查找 👍 371 👎 0
package leetcode.editor.cn;
//367:有效的完全平方数
public class ValidPerfectSquare {
public static void main(String[] args) {
Solution solution = new ValidPerfectSquare().new Solution();
// TO TEST
System.out.println(solution.isPerfectSquare(16));
System.out.println(solution.isPerfectSquare(808201));
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean isPerfectSquare(int num) {
if (num * num == num) {
return true;
}
int left = 0;
int right = num;
while (left < right) {
int mid = (right - left) / 2 + left;
long mul = (long) mid * mid;
if (mul == num) {
return true;
}
if (mul < num) {
left = mid + 1;
} else {
right = mid;
}
}
return false;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,96 @@
//<p>字符串可以用 <strong>缩写</strong> 进行表示<strong>缩写</strong> 的方法是将任意数量的 <strong>不相邻</strong> 的子字符串替换为相应子串的长度例如字符串 <code>"substitution"</code> 可以缩写为不止这几种方法</p>
//
//<ul>
// <li><code>"s10n"</code> (<code>"s <em><strong>ubstitutio</strong></em> n"</code>)</li>
// <li><code>"sub4u4"</code> (<code>"sub <em><strong>stit</strong></em> u <em><strong>tion</strong></em>"</code>)</li>
// <li><code>"12"</code> (<code>"<em><strong>substitution</strong></em>"</code>)</li>
// <li><code>"su3i1u2on"</code> (<code>"su <em><strong>bst</strong></em> i <em><strong>t</strong></em> u <em><strong>ti</strong></em> on"</code>)</li>
// <li><code>"substitution"</code> (没有替换子字符串)</li>
//</ul>
//
//<p>下列是不合法的缩写</p>
//
//<ul>
// <li><code>"s55n"</code>&nbsp;(<code>"s&nbsp;<u>ubsti</u>&nbsp;<u>tutio</u>&nbsp;n"</code>两处缩写相邻)</li>
// <li><code>"s010n"</code>&nbsp;(缩写存在前导零)</li>
// <li><code>"s0ubstitution"</code>&nbsp;(缩写是一个空字符串)</li>
//</ul>
//
//<p>给你一个字符串单词 <code>word</code> 和一个缩写&nbsp;<code>abbr</code>&nbsp;判断这个缩写是否可以是给定单词的缩写</p>
//
//<p><strong>子字符串</strong>是字符串中连续的<strong>非空</strong>字符序列</p>
//
//<p>&nbsp;</p>
//
//<p><strong>示例 1</strong></p>
//
//<pre>
//<strong>输入</strong>word = "internationalization", abbr = "i12iz4n"
//<strong>输出</strong>true
//<strong>解释</strong>单词 "internationalization" 可以缩写为 "i12iz4n" ("i <em><strong>nternational</strong></em> iz <em><strong>atio</strong></em> n")
//</pre>
//
//<p><strong>示例 2</strong></p>
//
//<pre>
//<strong>输入</strong>word = "apple", abbr = "a2e"
//<strong>输出</strong>false
//<strong>解释</strong>单词 "apple" 无法缩写为 "a2e"
//</pre>
//
//<p>&nbsp;</p>
//
//<p><strong>提示</strong></p>
//
//<ul>
// <li><code>1 &lt;= word.length &lt;= 20</code></li>
// <li><code>word</code> 仅由小写英文字母组成</li>
// <li><code>1 &lt;= abbr.length &lt;= 10</code></li>
// <li><code>abbr</code> 由小写英文字母和数字组成</li>
// <li><code>abbr</code> 中的所有数字均符合 32-bit 整数范围</li>
//</ul>
//<div><div>Related Topics</div><div><li>双指针</li><li>字符串</li></div></div><br><div><li>👍 39</li><li>👎 0</li></div>
package leetcode.editor.cn;
/**
* Classname ${NAME}
* Description 408:有效单词缩写
* Date ${DATE} ${TIME}
* author ${USER}
*/
public class ValidWordAbbreviation {
public static void main(String[] args) {
Solution solution = new ValidWordAbbreviation().new Solution();
// TO TEST
//solution.validWordAbbreviation("internationalization","i12iz4n");
solution.validWordAbbreviation("internationalization", "i5a11o1");
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean validWordAbbreviation(String word, String abbr) {
int index = 0;
for (int i = 0; i < abbr.length(); i++) {
if (Character.isDigit(abbr.charAt(i))) {
int num = abbr.charAt(i) - '0';
if (num == 0) {
return false;
}
i++;
while (i < abbr.length() && Character.isDigit(abbr.charAt(i))) {
num = num * 10 + (abbr.charAt(i) - '0');
i++;
}
index += num - 1;
i--;
} else if (index >= word.length() || abbr.charAt(i) != word.charAt(index)) {
return false;
}
index++;
}
return index == word.length();
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,39 @@
<p>给定两个字符串形式的非负整数&nbsp;<code>num1</code><code>num2</code>&nbsp;,计算它们的和并同样以字符串形式返回。</p>
<p>你不能使用任何內建的用于处理大整数的库(比如 <code>BigInteger</code>&nbsp;也不能直接将输入的字符串转换为整数形式。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>num1 = "11", num2 = "123"
<strong>输出:</strong>"134"
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>num1 = "456", num2 = "77"
<strong>输出:</strong>"533"
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>num1 = "0", num2 = "0"
<strong>输出:</strong>"0"
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= num1.length, num2.length &lt;= 10<sup>4</sup></code></li>
<li><code>num1</code><code>num2</code> 都只包含数字&nbsp;<code>0-9</code></li>
<li><code>num1</code><code>num2</code> 都不包含任何前导零</li>
</ul>
<div><div>Related Topics</div><div><li>数学</li><li>字符串</li><li>模拟</li></div></div><br><div><li>👍 541</li><li>👎 0</li></div>

View File

@ -0,0 +1,45 @@
<p>给你一个整数数组&nbsp;<code>salary</code>&nbsp;,数组里每个数都是 <strong>唯一</strong>&nbsp;的,其中&nbsp;<code>salary[i]</code> 是第&nbsp;<code>i</code>&nbsp;个员工的工资。</p>
<p>请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>salary = [4000,3000,1000,2000]
<strong>输出:</strong>2500.00000
<strong>解释:</strong>最低工资和最高工资分别是 1000 和 4000 。
去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>salary = [1000,2000,3000]
<strong>输出:</strong>2000.00000
<strong>解释:</strong>最低工资和最高工资分别是 1000 和 3000 。
去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000
</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong>salary = [6000,5000,4000,3000,2000,1000]
<strong>输出:</strong>3500.00000
</pre>
<p><strong>示例 4</strong></p>
<pre><strong>输入:</strong>salary = [8000,9000,2000,3000,6000,1000]
<strong>输出:</strong>4750.00000
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>3 &lt;= salary.length &lt;= 100</code></li>
<li><code>10^3&nbsp;&lt;= salary[i] &lt;= 10^6</code></li>
<li><code>salary[i]</code>&nbsp;是唯一的。</li>
<li>与真实值误差在&nbsp;<code>10^-5</code> 以内的结果都将视为正确答案。</li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>排序</li></div></div><br><div><li>👍 33</li><li>👎 0</li></div>

View File

@ -0,0 +1,48 @@
<p>二进制手表顶部有 4 个 LED 代表<strong> 小时0-11</strong>,底部的 6 个 LED 代表<strong> 分钟0-59</strong>。每个 LED 代表一个 0 或 1最低位在右侧。</p>
<ul>
<li>例如,下面的二进制手表读取 <code>"3:25"</code></li>
</ul>
<p><img src="https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/03/29/binary_clock_samui_moon.jpg" style="height: 300px; width" /></p>
<p><small><em>(图源:<a href="https://commons.m.wikimedia.org/wiki/File:Binary_clock_samui_moon.jpg">WikiMedia - Binary clock samui moon.jpg</a> ,许可协议:<a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)</a> </em></small></p>
<p>给你一个整数 <code>turnedOn</code> ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 <strong>按任意顺序</strong> 返回答案。</p>
<p>小时不会以零开头:</p>
<ul>
<li>例如,<code>"01:00"</code> 是无效的时间,正确的写法应该是 <code>"1:00"</code></li>
</ul>
<p>分钟必须由两位数组成,可能会以零开头:</p>
<ul>
<li>例如,<code>"10:2"</code> 是无效的时间,正确的写法应该是 <code>"10:02"</code></li>
</ul>
<p> </p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>turnedOn = 1
<strong>输出:</strong>["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>turnedOn = 9
<strong>输出:</strong>[]
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 <= turnedOn <= 10</code></li>
</ul>
<div><div>Related Topics</div><div><li>位运算</li><li>回溯</li></div></div><br><div><li>👍 356</li><li>👎 0</li></div>

View File

@ -0,0 +1,31 @@
<p>给你一个数字数组 <code>arr</code></p>
<p>如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 <strong>等差数列</strong></p>
<p>如果可以重新排列数组形成等差数列,请返回 <code>true</code> ;否则,返回 <code>false</code></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>arr = [3,5,1]
<strong>输出:</strong>true
<strong>解释:</strong>对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>arr = [1,2,4]
<strong>输出:</strong>false
<strong>解释:</strong>无法通过重新排序得到等差数列。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>2 &lt;= arr.length &lt;= 1000</code></li>
<li><code>-10^6 &lt;= arr[i] &lt;= 10^6</code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>排序</li></div></div><br><div><li>👍 23</li><li>👎 0</li></div>

View File

@ -0,0 +1,43 @@
<p>给你长度相等的两个字符串 <code>s1</code><code>s2</code> 。一次<strong> 字符串交换 </strong>操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。</p>
<p>如果对 <strong>其中一个字符串</strong> 执行 <strong>最多一次字符串交换</strong> 就可以使两个字符串相等,返回 <code>true</code> ;否则,返回 <code>false</code></p>
<p> </p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>s1 = "bank", s2 = "kanb"
<strong>输出:</strong>true
<strong>解释:</strong>例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>s1 = "attack", s2 = "defend"
<strong>输出:</strong>false
<strong>解释:</strong>一次字符串交换无法使两个字符串相等
</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong>s1 = "kelb", s2 = "kelb"
<strong>输出:</strong>true
<strong>解释:</strong>两个字符串已经相等,所以不需要进行字符串交换
</pre>
<p><strong>示例 4</strong></p>
<pre><strong>输入:</strong>s1 = "abcd", s2 = "dcba"
<strong>输出:</strong>false
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s1.length, s2.length &lt;= 100</code></li>
<li><code>s1.length == s2.length</code></li>
<li><code>s1</code><code>s2</code> 仅由小写英文字母组成</li>
</ul>
<div><div>Related Topics</div><div><li>哈希表</li><li>字符串</li><li>计数</li></div></div><br><div><li>👍 29</li><li>👎 0</li></div>

View File

@ -0,0 +1,22 @@
<p>给定一个不为空的二叉搜索树和一个目标值 target请在该二叉搜索树中找到最接近目标值 target 的数值。</p>
<p><strong>注意:</strong></p>
<ul>
<li>给定的目标值 target 是一个浮点数</li>
<li>题目保证在该二叉搜索树中只会存在一个最接近目标值的数</li>
</ul>
<p><strong>示例:</strong></p>
<pre><strong>输入:</strong> root = [4,2,5,1,3],目标值 target = 3.714286
4
/ \
2 5
/ \
1 3
<strong>输出:</strong> 4
</pre>
<div><div>Related Topics</div><div><li></li><li>深度优先搜索</li><li>二叉搜索树</li><li>二分查找</li><li>二叉树</li></div></div><br><div><li>👍 112</li><li>👎 0</li></div>

View File

@ -0,0 +1,30 @@
给你一个整数 <code>n</code> ,统计并返回各位数字都不同的数字 <code>x</code> 的个数,其中 <code>0 &lt;= x &lt; 10<sup>n</sup></code><sup>&nbsp;</sup>
<div class="original__bRMd">
<div>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>n = 2
<strong>输出:</strong>91
<strong>解释:</strong>答案应为除去 <code>11、22、33、44、55、66、77、88、99 </code>外,在 0 ≤ x &lt; 100 范围内的所有数字。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>n = 0
<strong>输出:</strong>1
</pre>
</div>
</div>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 &lt;= n &lt;= 8</code></li>
</ul>
<div><div>Related Topics</div><div><li>数学</li><li>动态规划</li><li>回溯</li></div></div><br><div><li>👍 217</li><li>👎 0</li></div>

View File

@ -0,0 +1,24 @@
<p>给你两个非负整数&nbsp;<code>low</code>&nbsp;<code>high</code>&nbsp;。请你返回<em>&nbsp;</em><code>low</code><em> </em><em>&nbsp;</em><code>high</code><em>&nbsp;</em>之间(包括二者)奇数的数目。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>low = 3, high = 7
<strong>输出:</strong>3
<strong>解释:</strong>3 到 7 之间奇数数字为 [3,5,7] 。</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>low = 8, high = 10
<strong>输出:</strong>1
<strong>解释:</strong>8 到 10 之间奇数数字为 [9] 。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 &lt;= low &lt;= high&nbsp;&lt;= 10^9</code></li>
</ul>
<div><div>Related Topics</div><div><li>数学</li></div></div><br><div><li>👍 48</li><li>👎 0</li></div>

View File

@ -0,0 +1,34 @@
<p>给定整数 <code>n</code> ,返回 <em>所有小于非负整数&nbsp;<code>n</code>&nbsp;的质数的数量</em></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>n = 10
<strong>输出:</strong>4
<strong>解释:</strong>小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>n = 0
<strong>输出:</strong>0
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>n = 1
<strong>输出</strong>0
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 &lt;= n &lt;= 5 * 10<sup>6</sup></code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>数学</li><li>枚举</li><li>数论</li></div></div><br><div><li>👍 869</li><li>👎 0</li></div>

View File

@ -0,0 +1,50 @@
<p>给你一个整数 <code>n</code> ,对于&nbsp;<code>0 &lt;= i &lt;= n</code> 中的每个 <code>i</code> ,计算其二进制表示中 <strong><code>1</code> 的个数</strong> ,返回一个长度为 <code>n + 1</code> 的数组 <code>ans</code> 作为答案。</p>
<p>&nbsp;</p>
<div class="original__bRMd">
<div>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>n = 2
<strong>输出:</strong>[0,1,1]
<strong>解释:</strong>
0 --&gt; 0
1 --&gt; 1
2 --&gt; 10
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>n = 5
<strong>输出:</strong>[0,1,1,2,1,2]
<strong>解释:</strong>
0 --&gt; 0
1 --&gt; 1
2 --&gt; 10
3 --&gt; 11
4 --&gt; 100
5 --&gt; 101
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 &lt;= n &lt;= 10<sup>5</sup></code></li>
</ul>
<p>&nbsp;</p>
<p><strong>进阶:</strong></p>
<ul>
<li>很容易就能实现时间复杂度为 <code>O(n log n)</code> 的解决方案,你可以在线性时间复杂度 <code>O(n)</code> 内用一趟扫描解决此问题吗?</li>
<li>你能不使用任何内置函数解决此问题吗C++ 中的&nbsp;<code>__builtin_popcount</code> </li>
</ul>
</div>
</div>
<div><div>Related Topics</div><div><li>位运算</li><li>动态规划</li></div></div><br><div><li>👍 967</li><li>👎 0</li></div>

View File

@ -0,0 +1,39 @@
<p>给你两个整数&nbsp;<code>x</code>&nbsp;<code>y</code>&nbsp;,表示你在一个笛卡尔坐标系下的&nbsp;<code>(x, y)</code>&nbsp;处。同时,在同一个坐标系下给你一个数组&nbsp;<code>points</code>&nbsp;,其中&nbsp;<code>points[i] = [a<sub>i</sub>, b<sub>i</sub>]</code>&nbsp;表示在&nbsp;<code>(a<sub>i</sub>, b<sub>i</sub>)</code>&nbsp;处有一个点。当一个点与你所在的位置有相同的 <code>x</code> 坐标或者相同的 <code>y</code> 坐标时,我们称这个点是 <b>有效的</b>&nbsp;</p>
<p>请返回距离你当前位置&nbsp;<strong>曼哈顿距离</strong>&nbsp;最近的&nbsp;<strong>有效</strong>&nbsp;点的下标(下标从 <strong>0</strong> 开始)。如果有多个最近的有效点,请返回下标&nbsp;<strong>最小</strong>&nbsp;的一个。如果没有有效点,请返回&nbsp;<code>-1</code>&nbsp;</p>
<p>两个点 <code>(x<sub>1</sub>, y<sub>1</sub>)</code>&nbsp;<code>(x<sub>2</sub>, y<sub>2</sub>)</code>&nbsp;之间的 <strong>曼哈顿距离</strong>&nbsp;&nbsp;<code>abs(x<sub>1</sub> - x<sub>2</sub>) + abs(y<sub>1</sub> - y<sub>2</sub>)</code>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>x = 3, y = 4, points = [[1,2],[3,1],[2,4],[2,3],[4,4]]
<b>输出:</b>2
<b>解释:</b>所有点中,[3,1][2,4] 和 [4,4] 是有效点。有效点中,[2,4] 和 [4,4] 距离你当前位置的曼哈顿距离最小,都为 1 。[2,4] 的下标最小,所以返回 2 。</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>x = 3, y = 4, points = [[3,4]]
<b>输出:</b>0
<b>提示:</b>答案可以与你当前所在位置坐标相同。</pre>
<p><strong>示例 3</strong></p>
<pre>
<b>输入:</b>x = 3, y = 4, points = [[2,3]]
<b>输出:</b>-1
<b>解释:</b>没有 有效点。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= points.length &lt;= 10<sup>4</sup></code></li>
<li><code>points[i].length == 2</code></li>
<li><code>1 &lt;= x, y, a<sub>i</sub>, b<sub>i</sub> &lt;= 10<sup>4</sup></code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li></div></div><br><div><li>👍 26</li><li>👎 0</li></div>

View File

@ -0,0 +1,53 @@
<p>给你一个整数数组 <code>digits</code> ,其中每个元素是一个数字(<code>0 - 9</code>)。数组中可能存在重复元素。</p>
<p>你需要找出 <strong>所有</strong> 满足下述条件且 <strong>互不相同</strong> 的整数:</p>
<ul>
<li>该整数由 <code>digits</code> 中的三个元素按 <strong>任意</strong> 顺序 <strong>依次连接</strong> 组成。</li>
<li>该整数不含 <strong>前导零</strong></li>
<li>该整数是一个 <strong>偶数</strong></li>
</ul>
<p>例如,给定的 <code>digits</code><code>[1, 2, 3]</code> ,整数 <code>132</code><code>312</code> 满足上面列出的全部条件。</p>
<p>将找出的所有互不相同的整数按 <strong>递增顺序</strong> 排列,并以数组形式返回<em></em></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>digits = [2,1,3,0]
<strong>输出:</strong>[102,120,130,132,210,230,302,310,312,320]
<strong>解释:</strong>
所有满足题目条件的整数都在输出数组中列出。
注意,答案数组中不含有 <strong>奇数</strong> 或带 <strong>前导零</strong> 的整数。</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>digits = [2,2,8,8,2]
<strong>输出:</strong>[222,228,282,288,822,828,882]
<strong>解释:</strong>
同样的数字0 - 9在构造整数时可以重复多次重复次数最多与其在 <code>digits</code> 中出现的次数一样。
在这个例子中,数字 8 在构造 288、828 和 882 时都重复了两次。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>digits = [3,7,5]
<strong>输出:</strong>[]
<strong>解释:</strong>
使用给定的 digits 无法构造偶数。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>3 &lt;=&nbsp;digits.length &lt;= 100</code></li>
<li><code>0 &lt;= digits[i] &lt;= 9</code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>哈希表</li><li>枚举</li><li>排序</li></div></div><br><div><li>👍 16</li><li>👎 0</li></div>

View File

@ -0,0 +1,31 @@
<p>你和朋友玩一个叫做「翻转游戏」的游戏。游戏规则如下:</p>
<p>给你一个字符串 <code>currentState</code> ,其中只含 <code>'+'</code><code>'-'</code> 。你和朋友轮流将 <strong>连续 </strong>的两个 <code>"++"</code> 反转成 <code>"--"</code> 。当一方无法进行有效的翻转时便意味着游戏结束,则另一方获胜。</p>
<p>计算并返回 <strong>一次有效操作</strong> 后,字符串 <code>currentState</code> 所有的可能状态,返回结果可以按 <strong>任意顺序</strong> 排列。如果不存在可能的有效操作,请返回一个空列表 <code>[]</code></p>
<p> </p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>currentState = "++++"
<strong>输出:</strong>["--++","+--+","++--"]
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>currentState = "+"
<strong>输出:</strong>[]
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 <= currentState.length <= 500</code></li>
<li><code>currentState[i]</code> 不是 <code>'+'</code> 就是 <code>'-'</code></li>
</ul>
<div><div>Related Topics</div><div><li>字符串</li></div></div><br><div><li>👍 33</li><li>👎 0</li></div>

View File

@ -0,0 +1,28 @@
<p>给你一个整数 <code>n</code> ,按字典序返回范围 <code>[1, n]</code> 内所有整数。</p>
<p>你必须设计一个时间复杂度为 <code>O(n)</code> 且使用 <code>O(1)</code> 额外空间的算法。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>n = 13
<strong>输出:</strong>[1,10,11,12,13,2,3,4,5,6,7,8,9]
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>n = 2
<strong>输出:</strong>[1,2]
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n &lt;= 5 * 10<sup>4</sup></code></li>
</ul>
<div><div>Related Topics</div><div><li>深度优先搜索</li><li>字典树</li></div></div><br><div><li>👍 277</li><li>👎 0</li></div>

View File

@ -0,0 +1,43 @@
<p>请你设计一个日志系统,可以流式接收消息以及它的时间戳。每条 <strong>不重复</strong> 的消息最多只能每 10 秒打印一次。也就是说,如果在时间戳 <code>t</code> 打印某条消息,那么相同内容的消息直到时间戳变为 <code>t + 10</code> 之前都不会被打印。</p>
<p>所有消息都按时间顺序发送。多条消息可能到达同一时间戳。</p>
<p>实现 <code>Logger</code> 类:</p>
<ul>
<li><code>Logger()</code> 初始化 <code>logger</code> 对象</li>
<li><code>bool shouldPrintMessage(int timestamp, string message)</code> 如果这条消息 <code>message</code> 在给定的时间戳 <code>timestamp</code> 应该被打印出来,则返回 <code>true</code> ,否则请返回 <code>false</code></li>
</ul>
<p> </p>
<p><strong>示例:</strong></p>
<pre>
<strong>输入:</strong>
["Logger", "shouldPrintMessage", "shouldPrintMessage", "shouldPrintMessage", "shouldPrintMessage", "shouldPrintMessage", "shouldPrintMessage"]
[[], [1, "foo"], [2, "bar"], [3, "foo"], [8, "bar"], [10, "foo"], [11, "foo"]]
<strong>输出:</strong>
[null, true, true, false, false, false, true]
<strong>解释:</strong>
Logger logger = new Logger();
logger.shouldPrintMessage(1, "foo"); // 返回 true ,下一次 "foo" 可以打印的时间戳是 1 + 10 = 11
logger.shouldPrintMessage(2, "bar"); // 返回 true ,下一次 "bar" 可以打印的时间戳是 2 + 10 = 12
logger.shouldPrintMessage(3, "foo"); // 3 < 11 返回 false
logger.shouldPrintMessage(8, "bar"); // 8 < 12 返回 false
logger.shouldPrintMessage(10, "foo"); // 10 < 11 返回 false
logger.shouldPrintMessage(11, "foo"); // 11 >= 11 ,返回 true ,下一次 "foo" 可以打印的时间戳是 11 + 10 = 21
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 <= timestamp <= 10<sup>9</sup></code></li>
<li>每个 <code>timestamp</code> 都将按非递减顺序(时间顺序)传递</li>
<li><code>1 <= message.length <= 30</code></li>
<li>最多调用 <code>10<sup>4</sup></code><code>shouldPrintMessage</code> 方法</li>
</ul>
<div><div>Related Topics</div><div><li>设计</li><li>哈希表</li></div></div><br><div><li>👍 62</li><li>👎 0</li></div>

View File

@ -0,0 +1,28 @@
<p>给定一个会议时间安排的数组 <code>intervals</code> ,每个会议时间都会包括开始和结束的时间 <code>intervals[i] = [start<sub>i</sub>, end<sub>i</sub>]</code> ,请你判断一个人是否能够参加这里面的全部会议。</p>
<p> </p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>intervals = [[0,30],[5,10],[15,20]]
<strong>输出</strong>false
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>intervals = [[7,10],[2,4]]
<strong>输出</strong>true
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 <= intervals.length <= 10<sup>4</sup></code></li>
<li><code>intervals[i].length == 2</code></li>
<li><code>0 <= start<sub>i</sub> < end<sub>i</sub> <= 10<sup>6</sup></code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>排序</li></div></div><br><div><li>👍 117</li><li>👎 0</li></div>

View File

@ -0,0 +1,37 @@
<p>给你两个字符串 <code>current</code><code>correct</code> ,表示两个 <strong>24 小时制时间</strong></p>
<p><strong>24 小时制时间</strong><code>"HH:MM"</code> 进行格式化,其中 <code>HH</code><code>00</code><code>23</code> 之间,而 <code>MM</code><code>00</code><code>59</code> 之间。最早的 24 小时制时间为 <code>00:00</code> ,最晚的是 <code>23:59</code></p>
<p>在一步操作中,你可以将 <code>current</code> 这个时间增加 <code>1</code><code>5</code><code>15</code><code>60</code> 分钟。你可以执行这一操作 <strong>任意</strong> 次数。</p>
<p>返回将&nbsp;<code>current</code><em> </em>转化为<em> </em><code>correct</code> 需要的 <strong>最少操作数</strong></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>current = "02:30", correct = "04:35"
<strong>输出:</strong>3
<strong>解释:
</strong>可以按下述 3 步操作将 current 转换为 correct
- 为 current 加 60 分钟current 变为 "03:30" 。
- 为 current 加 60 分钟current 变为 "04:30" 。
- 为 current 加 5 分钟current 变为 "04:35" 。
可以证明,无法用少于 3 步操作将 current 转化为 correct 。</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>current = "11:00", correct = "11:01"
<strong>输出:</strong>1
<strong>解释:</strong>只需要为 current 加一分钟,所以最小操作数是 1 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>current</code><code>correct</code> 都符合 <code>"HH:MM"</code> 格式</li>
<li><code>current &lt;= correct</code></li>
</ul>
<div><div>Related Topics</div><div><li>贪心</li><li>字符串</li></div></div><br><div><li>👍 7</li><li>👎 0</li></div>

View File

@ -0,0 +1,38 @@
<p>我们要把给定的字符串 <code>S</code>&nbsp;从左到右写到每一行上每一行的最大宽度为100个单位如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写到下一行。我们给定了一个数组&nbsp;<code>widths</code>&nbsp;,这个数组&nbsp;widths[0] 代表 &#39;a&#39; 需要的单位,&nbsp;widths[1] 代表 &#39;b&#39; 需要的单位,...&nbsp;widths[25] 代表 &#39;z&#39; 需要的单位。</p>
<p>现在回答两个问题:至少多少行能放下<code>S</code>以及最后一行使用的宽度是多少个单位将你的答案作为长度为2的整数列表返回。</p>
<pre>
<strong>示例 1:</strong>
<strong>输入:</strong>
widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = &quot;abcdefghijklmnopqrstuvwxyz&quot;
<strong>输出:</strong> [3, 60]
<strong>解释:
</strong>所有的字符拥有相同的占用单位10。所以书写所有的26个字母
我们需要2个整行和占用60个单位的一行。
</pre>
<pre>
<strong>示例 2:</strong>
<strong>输入:</strong>
widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = &quot;bbbcccdddaaa&quot;
<strong>输出:</strong> [2, 4]
<strong>解释:
</strong>除去字母&#39;a&#39;所有的字符都是相同的单位10并且字符串 &quot;bbbcccdddaa&quot; 将会覆盖 9 * 10 + 2 * 4 = 98 个单位.
最后一个字母 &#39;a&#39; 将会被写到第二行因为第一行只剩下2个单位了。
所以这个答案是2行第二行有4个单位宽度。
</pre>
<p>&nbsp;</p>
<p><strong>注:</strong></p>
<ul>
<li>字符串&nbsp;<code>S</code> 的长度在&nbsp;[1, 1000] 的范围。</li>
<li><code>S</code> 只包含小写字母。</li>
<li><code>widths</code> 是长度为&nbsp;<code>26</code>的数组。</li>
<li><code>widths[i]</code>&nbsp;值的范围在&nbsp;<code>[2, 10]</code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>字符串</li></div></div><br><div><li>👍 69</li><li>👎 0</li></div>

View File

@ -0,0 +1,17 @@
<p>给定一个字符串,判断该字符串中是否可以通过重新排列组合,形成一个回文字符串。</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong> <code>&quot;code&quot;</code>
<strong>输出:</strong> false</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong> <code>&quot;aab&quot;</code>
<strong>输出:</strong> true</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong> <code>&quot;carerac&quot;</code>
<strong>输出:</strong> true</pre>
<div><div>Related Topics</div><div><li>位运算</li><li>哈希表</li><li>字符串</li></div></div><br><div><li>👍 59</li><li>👎 0</li></div>

View File

@ -0,0 +1,42 @@
<p>给定一个整数数组 &nbsp;<code>nums</code>,处理以下类型的多个查询:</p>
<ol>
<li>计算索引&nbsp;<code>left</code>&nbsp;&nbsp;<code>right</code>&nbsp;(包含 <code>left</code><code>right</code>)之间的 <code>nums</code> 元素的 <strong></strong> ,其中&nbsp;<code>left &lt;= right</code></li>
</ol>
<p>实现 <code>NumArray</code> 类:</p>
<ul>
<li><code>NumArray(int[] nums)</code> 使用数组 <code>nums</code> 初始化对象</li>
<li><code>int sumRange(int i, int j)</code> 返回数组 <code>nums</code>&nbsp;中索引&nbsp;<code>left</code>&nbsp;&nbsp;<code>right</code>&nbsp;之间的元素的 <strong>总和</strong> ,包含&nbsp;<code>left</code>&nbsp;&nbsp;<code>right</code>&nbsp;两点(也就是&nbsp;<code>nums[left] + nums[left + 1] + ... + nums[right]</code>&nbsp;)</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
<strong>输出:
</strong>[null, 1, -1, -3]
<strong>解释:</strong>
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 10<sup>4</sup></code></li>
<li><code>-10<sup>5</sup>&nbsp;&lt;= nums[i] &lt;=&nbsp;10<sup>5</sup></code></li>
<li><code>0 &lt;= i &lt;= j &lt; nums.length</code></li>
<li>最多调用 <code>10<sup>4</sup></code><code>sumRange</code><strong> </strong>方法</li>
</ul>
<div><div>Related Topics</div><div><li>设计</li><li>数组</li><li>前缀和</li></div></div><br><div><li>👍 443</li><li>👎 0</li></div>

View File

@ -0,0 +1,38 @@
<p>给定一个非空的字符串<meta charset="UTF-8" />&nbsp;<code>s</code>&nbsp;,检查是否可以通过由它的一个子串重复多次构成。</p>
<p>&nbsp;</p>
<p><strong>示例 1:</strong></p>
<pre>
<strong>输入:</strong> s = "abab"
<strong>输出:</strong> true
<strong>解释:</strong> 可由子串 "ab" 重复两次构成。
</pre>
<p><strong>示例 2:</strong></p>
<pre>
<strong>输入:</strong> s = "aba"
<strong>输出:</strong> false
</pre>
<p><strong>示例 3:</strong></p>
<pre>
<strong>输入:</strong> s = "abcabcabcabc"
<strong>输出:</strong> true
<strong>解释:</strong> 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
</pre>
<p>&nbsp;</p>
<p><b>提示:</b></p>
<p><meta charset="UTF-8" /></p>
<ul>
<li><code>1 &lt;= s.length &lt;= 10<sup>4</sup></code></li>
<li><code>s</code>&nbsp;由小写英文字母组成</li>
</ul>
<div><div>Related Topics</div><div><li>字符串</li><li>字符串匹配</li></div></div><br><div><li>👍 676</li><li>👎 0</li></div>

View File

@ -0,0 +1,43 @@
<p>给你一个 <code>m x n</code> 的整数网格 <code>accounts</code> ,其中 <code>accounts[i][j]</code> 是第 <code>i<sup></sup></code> 位客户在第 <code>j</code> 家银行托管的资产数量。返回最富有客户所拥有的 <strong>资产总量</strong></p>
<p>客户的 <strong>资产总量</strong> 就是他们在各家银行托管的资产数量之和。最富有客户就是 <strong>资产总量</strong> 最大的客户。</p>
<p> </p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>accounts = [[1,2,3],[3,2,1]]
<strong>输出:</strong>6
<strong>解释:</strong>
<code>第 1 位客户的资产总量 = 1 + 2 + 3 = 6
第 2 位客户的资产总量 = 3 + 2 + 1 = 6
</code>两位客户都是最富有的,资产总量都是 6 ,所以返回 6 。
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>accounts = [[1,5],[7,3],[3,5]]
<strong>输出:</strong>10
<strong>解释:</strong>
<code>第 1 位客户的资产总量</code> = 6
<code>第 2 位客户的资产总量</code> = 10
<code>第 3 位客户的资产总量</code> = 8
第 2 位客户是最富有的,资产总量是 10</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong>accounts = [[2,8,7],[7,1,3],[1,9,5]]
<strong>输出:</strong>17
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>m == accounts.length</code></li>
<li><code>n == accounts[i].length</code></li>
<li><code>1 &lt;= m, n &lt;= 50</code></li>
<li><code>1 &lt;= accounts[i][j] &lt;= 100</code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>矩阵</li></div></div><br><div><li>👍 53</li><li>👎 0</li></div>

View File

@ -0,0 +1,55 @@
<p>总计有 <code>n</code> 个环,环的颜色可以是红、绿、蓝中的一种。这些环分布穿在 10 根编号为 <code>0</code><code>9</code> 的杆上。</p>
<p>给你一个长度为 <code>2n</code> 的字符串 <code>rings</code> ,表示这 <code>n</code> 个环在杆上的分布。<code>rings</code> 中每两个字符形成一个 <strong>颜色位置对</strong> ,用于描述每个环:</p>
<ul>
<li><code>i</code> 对中的 <strong>第一个</strong> 字符表示第 <code>i</code> 个环的 <strong>颜色</strong><code>'R'</code><code>'G'</code><code>'B'</code>)。</li>
<li><code>i</code> 对中的 <strong>第二个</strong> 字符表示第 <code>i</code> 个环的 <strong>位置</strong>,也就是位于哪根杆上(<code>'0'</code><code>'9'</code>)。</li>
</ul>
<p>例如,<code>"R3G2B1"</code> 表示:共有 <code>n == 3</code> 个环,红色的环在编号为 3 的杆上,绿色的环在编号为 2 的杆上,蓝色的环在编号为 1 的杆上。</p>
<p>找出所有集齐 <strong>全部三种颜色</strong> 环的杆,并返回这种杆的数量。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/11/23/ex1final.png" style="width: 258px; height: 130px;">
<pre><strong>输入:</strong>rings = "B0B6G0R6R0R6G9"
<strong>输出:</strong>1
<strong>解释:</strong>
- 编号 0 的杆上有 3 个环,集齐全部颜色:红、绿、蓝。
- 编号 6 的杆上有 3 个环,但只有红、蓝两种颜色。
- 编号 9 的杆上只有 1 个绿色环。
因此,集齐全部三种颜色环的杆的数目为 1 。
</pre>
<p><strong>示例 2</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/11/23/ex2final.png" style="width: 266px; height: 130px;">
<pre><strong>输入:</strong>rings = "B0R0G0R9R0B0G0"
<strong>输出:</strong>1
<strong>解释:</strong>
- 编号 0 的杆上有 6 个环,集齐全部颜色:红、绿、蓝。
- 编号 9 的杆上只有 1 个红色环。
因此,集齐全部三种颜色环的杆的数目为 1 。
</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong>rings = "G4"
<strong>输出:</strong>0
<strong>解释:</strong>
只给了一个环,因此,不存在集齐全部三种颜色环的杆。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>rings.length == 2 * n</code></li>
<li><code>1 &lt;= n &lt;= 100</code></li>
<li><code>i</code><strong>偶数</strong> ,则&nbsp;<code>rings[i]</code> 的值可以取 <code>'R'</code><code>'G'</code><code>'B'</code>(下标从 <strong>0</strong> 开始计数)</li>
<li><code>i</code><strong>奇数</strong> ,则&nbsp;<code>rings[i]</code> 的值可以取 <code>'0'</code><code>'9'</code> 中的一个数字(下标从 <strong>0</strong> 开始计数)</li>
</ul>
<div><div>Related Topics</div><div><li>哈希表</li><li>字符串</li></div></div><br><div><li>👍 13</li><li>👎 0</li></div>

View File

@ -0,0 +1,29 @@
<p>给定一个字符串数组&nbsp;<code>wordDict</code>&nbsp;和两个已经存在于该数组中的不同的字符串&nbsp;<code>word1</code><code>word2</code> 。返回列表中这两个单词之间的最短距离。</p>
<p>&nbsp;</p>
<p><strong>示例 1:</strong></p>
<pre>
<strong>输入:</strong> wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 = "coding", word2 = "practice"
<strong>输出:</strong> 3
</pre>
<p><strong>示例&nbsp;2:</strong></p>
<pre>
<strong>输入:</strong> wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 = "makes", word2 = "coding"
<strong>输出:</strong> 1</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong><meta charset="UTF-8" /></p>
<ul>
<li><code>1 &lt;= wordsDict.length &lt;= 3 * 10<sup>4</sup></code></li>
<li><code>1 &lt;= wordsDict[i].length &lt;= 10</code></li>
<li><code>wordsDict[i]</code>&nbsp;由小写英文字母组成</li>
<li><code>word1</code>&nbsp;&nbsp;<code>word2</code>&nbsp;&nbsp;<code>wordsDict</code></li>
<li><code>word1 != word2</code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>字符串</li></div></div><br><div><li>👍 90</li><li>👎 0</li></div>

View File

@ -0,0 +1,47 @@
<p>已知函数 <code>signFunc(x)</code> 将会根据 <code>x</code> 的正负返回特定值:</p>
<ul>
<li>如果 <code>x</code> 是正数,返回 <code>1</code></li>
<li>如果 <code>x</code> 是负数,返回 <code>-1</code></li>
<li>如果 <code>x</code> 是等于 <code>0</code> ,返回 <code>0</code></li>
</ul>
<p>给你一个整数数组 <code>nums</code> 。令 <code>product</code> 为数组 <code>nums</code> 中所有元素值的乘积。</p>
<p>返回 <code>signFunc(product)</code></p>
<p> </p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [-1,-2,-3,-4,3,2,1]
<strong>输出:</strong>1
<strong>解释:</strong>数组中所有值的乘积是 144 ,且 signFunc(144) = 1
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [1,5,0,2,-3]
<strong>输出:</strong>0
<strong>解释:</strong>数组中所有值的乘积是 0 ,且 signFunc(0) = 0
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>nums = [-1,1,-1,1,-1]
<strong>输出:</strong>-1
<strong>解释:</strong>数组中所有值的乘积是 -1 ,且 signFunc(-1) = -1
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 <= nums.length <= 1000</code></li>
<li><code>-100 <= nums[i] <= 100</code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>数学</li></div></div><br><div><li>👍 20</li><li>👎 0</li></div>

View File

@ -0,0 +1,32 @@
<p>给你一个整数&nbsp;<code>n</code>,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>n = 234
<strong>输出:</strong>15
<strong>解释:</strong>
各位数之积 = 2 * 3 * 4 = 24
各位数之和 = 2 + 3 + 4 = 9
结果 = 24 - 9 = 15
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>n = 4421
<strong>输出:</strong>21
<strong>解释:
</strong>各位数之积 = 4 * 4 * 2 * 1 = 32
各位数之和 = 4 + 4 + 2 + 1 = 11
结果 = 32 - 11 = 21
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n &lt;= 10^5</code></li>
</ul>
<div><div>Related Topics</div><div><li>数学</li></div></div><br><div><li>👍 81</li><li>👎 0</li></div>

View File

@ -0,0 +1,28 @@
<p>给定一个 <strong>正整数</strong> <code>num</code> ,编写一个函数,如果 <code>num</code> 是一个完全平方数,则返回 <code>true</code> ,否则返回 <code>false</code></p>
<p><strong>进阶:不要</strong> 使用任何内置的库函数,如  <code>sqrt</code></p>
<p> </p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>num = 16
<strong>输出:</strong>true
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>num = 14
<strong>输出:</strong>false
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 <= num <= 2^31 - 1</code></li>
</ul>
<div><div>Related Topics</div><div><li>数学</li><li>二分查找</li></div></div><br><div><li>👍 371</li><li>👎 0</li></div>

View File

@ -0,0 +1,52 @@
<p>字符串可以用 <strong>缩写</strong> 进行表示,<strong>缩写</strong> 的方法是将任意数量的 <strong>不相邻</strong> 的子字符串替换为相应子串的长度。例如,字符串 <code>"substitution"</code> 可以缩写为(不止这几种方法):</p>
<ul>
<li><code>"s10n"</code> (<code>"s <em><strong>ubstitutio</strong></em> n"</code>)</li>
<li><code>"sub4u4"</code> (<code>"sub <em><strong>stit</strong></em> u <em><strong>tion</strong></em>"</code>)</li>
<li><code>"12"</code> (<code>"<em><strong>substitution</strong></em>"</code>)</li>
<li><code>"su3i1u2on"</code> (<code>"su <em><strong>bst</strong></em> i <em><strong>t</strong></em> u <em><strong>ti</strong></em> on"</code>)</li>
<li><code>"substitution"</code> (没有替换子字符串)</li>
</ul>
<p>下列是不合法的缩写:</p>
<ul>
<li><code>"s55n"</code>&nbsp;(<code>"s&nbsp;<u>ubsti</u>&nbsp;<u>tutio</u>&nbsp;n"</code>,两处缩写相邻)</li>
<li><code>"s010n"</code>&nbsp;(缩写存在前导零)</li>
<li><code>"s0ubstitution"</code>&nbsp;(缩写是一个空字符串)</li>
</ul>
<p>给你一个字符串单词 <code>word</code> 和一个缩写&nbsp;<code>abbr</code>&nbsp;,判断这个缩写是否可以是给定单词的缩写。</p>
<p><strong>子字符串</strong>是字符串中连续的<strong>非空</strong>字符序列。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>word = "internationalization", abbr = "i12iz4n"
<strong>输出:</strong>true
<strong>解释:</strong>单词 "internationalization" 可以缩写为 "i12iz4n" ("i <em><strong>nternational</strong></em> iz <em><strong>atio</strong></em> n") 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>word = "apple", abbr = "a2e"
<strong>输出:</strong>false
<strong>解释:</strong>单词 "apple" 无法缩写为 "a2e" 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= word.length &lt;= 20</code></li>
<li><code>word</code> 仅由小写英文字母组成</li>
<li><code>1 &lt;= abbr.length &lt;= 10</code></li>
<li><code>abbr</code> 由小写英文字母和数字组成</li>
<li><code>abbr</code> 中的所有数字均符合 32-bit 整数范围</li>
</ul>
<div><div>Related Topics</div><div><li>双指针</li><li>字符串</li></div></div><br><div><li>👍 39</li><li>👎 0</li></div>