简单题
搜索插入位置
time: 2023/10/13简单题
题目
我的解题
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
int mid = 0;
while (right >= left){
mid = (left + right) / 2;
if (left == right && nums[mid] != target) {
if (nums[mid] > target) return left;
else return left+1;
}
else {
if (nums[mid] == target) return mid;
else if (nums[mid] > target) right = mid;
else left = mid+1;
}
}
return right;
}
}
结果
最后一个单词的长度
time: 2023/10/13简单题
题目
解答
class Solution {
public int lengthOfLastWord(String s) {
String[] ret = s.split(" ");
return ret[ret.length-1].length();
}
}
结果
加一
time: 2023/10/13简单题
题目
我的解答1:
class Solution {
public int[] plusOne(int[] digits) {
int num = 0;
int count = 0;
int demo = 0;
int[] ret;
for (int e : digits) num = num * 10 + e;
demo = ++num;
while (demo > 0) {
demo /= 10;
count++;
}
ret = new int[count];
for (int i = count-1; i >= 0 ; i--){
ret[i] = num % 10;
num /= 10;
}
return ret;
}
}
错误原因: int只有10位数,这里最多有100位,所以不能转为int.
我的解答2:
class Solution {
public int[] plusOne(int[] digits) {
int flag = 0;
int[] ret;
boolean carry = false;
for (int i = 0; i < digits.length; i++)
if (digits[i] != 9){
flag = 1;
break;
}
if (flag == 0) ret = new int[digits.length + 1];
else ret = new int[digits.length];
ret[ret.length-1] = digits[digits.length -1] + 1;
if (ret[ret.length-1] == 10){
ret[ret.length-1] = 0;
carry = true;
}
for (int i = digits.length - 2; i >= 0; i--){
if (carry){
int demo = digits[i] + 1;
if (demo == 10) ret[i] = 0;
else {
ret[i] = demo;
carry = false;
}
}else{
for (int j = i; j >= 0; j--) ret[j] = digits[j];
}
}
if (ret.length != digits.length && carry == true) ret[0] = 1;
return ret;
}
}
结果:
9. 回文数
time: 2023/10/16简单题
题目
我的解答
class Solution {
public boolean isPalindrome(int x) {
int demo = x;
int n = 0;
if (x < 0) return false;
else{
while (demo > 0){
n = n * 10 + demo % 10;
demo/=10;
}
return n == x;
}
}
}
结果
13. 罗马数字转整数
题目
time: 2023/10/16简单题
我的解答
class Solution {
public int romanToInt(String s) {
int count = 0;
Map<Character, Integer> map = new HashMap<>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
for (int i = 0; i < s.length(); i++){
if (i+1 < s.length() && map.get(s.charAt(i)) < map.get(s.charAt(i+1))){
count += map.get(s.charAt(i+1))-map.get(s.charAt(i));
i++;
}else{
count += map.get(s.charAt(i));
}
}
return count;
}
}
结果
刷题小tips 中第一条优化一下,使用switch替换
我的解答二:
class Solution {
public int romanToInt(String s) {
int count = 0;
for (int i = 0; i < s.length(); i++){
if (i+1 < s.length() && getValue(s.charAt(i)) < getValue(s.charAt(i+1))){
count += getValue(s.charAt(i+1))-getValue(s.charAt(i));
i++;
}else{
count += getValue(s.charAt(i));
}
}
return count;
}
private int getValue(char ch) {
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return 0;
}
}
}
结果
14. 最长公共前缀
题目
time: 2023/10/16简单题
我的解答
class Solution {
public String longestCommonPrefix(String[] strs) {
int length = 200;
int i;
for (String s : strs)
length = Math.min(s.length(), length);
for (i = 0; i < length; i++){
boolean flag = true;
char c = strs[0].charAt(i);
for (String s : strs){
if (s.charAt(i) != c) {
flag = false;
break;
}
}
if (!flag){break;}
}
return strs[0].substring(0, i);
}
}
结果
20. 有效的括号
题目
time: 2023/10/16简单题
我的解答
class Solution {
public int demo(char e){
switch(e){
case '(': return 1;
case ')': return 4;
case '{': return 2;
case '}': return 5;
case '[': return 3;
case ']': return 6;
}
return 0;
}
public boolean isValid(String s) {
char[] c = s.toCharArray();
if (c.length % 2 == 1) return false;
else{
Deque<Integer> stack = new ArrayDeque<>();
for (char e : c){
if (demo(e) <= 3) stack.push(demo(e));
else{
if (stack.isEmpty()) return false;
else{
int i = stack.pop();
if (demo(e) - i != 3) {
return false;
}
}
}
}
return stack.isEmpty();
}
}
}
结果
21. 合并两个有序链表
题目
time: 2023/10/16简单题
我的解答
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode list = new ListNode(-1);
ListNode ret = list;
while(list1 != null && list2 != null){
if (list1.val <= list2.val){
ret.next = list1;
list1 = list1.next;
}else{
ret.next = list2;
list2 = list2.next;
}
ret = ret.next;
}
ret.next = list1 == null ? list2 : list1;
return list.next;
}
}
结果
136. 只出现一次的数字
time: 2023/10/14简单题
题目
我的解答1:
class Solution {
public int singleNumber(int[] nums) {
int ret = 0;
Arrays.sort(nums);
for (int i = 0; i < nums.length; i+=2){
if (i + 1 < nums.length){
if (nums[i+1] != nums[i]) {
ret = nums[i];
break;
}
}else{
ret = nums[i];
break;
}
}
return ret;
}
}
结果
我的解答二:(位运算)
class Solution {
public int singleNumber(int[] nums) {
int ret = 0;
for (int e : nums) ret = ret ^ e;
return ret;
}
}
结果
2652. 倍数求和
题目
time: 2023/10/17简单题
我的解答一(打表法):
class Solution {
public int sumOfMultiples(int n) {
int[] nums = {3,5,6,7,9,10,12,14,15,18,20,21,24,25,27,28,30,33,35,36,39,40,42,45,48,49,50,51,54,55,56,57,60,63,65,66,69,70,72,75,77,78,80,81,84,85,87,90,91,93,95,96,98,99,100,102,105,108,110,111,112,114,115,117,119,120,123,125,126,129,130,132,133,135,138,140,141,144,145,147,150,153,154,155,156,159,160,161,162,165,168,170,171,174,175,177,180,182,183,185,186,189,190,192,195,196,198,200,201,203,204,205,207,210,213,215,216,217,219,220,222,224,225,228,230,231,234,235,237,238,240,243,245,246,249,250,252,255,258,259,260,261,264,265,266,267,270,273,275,276,279,280,282,285,287,288,290,291,294,295,297,300,301,303,305,306,308,309,310,312,315,318,320,321,322,324,325,327,329,330,333,335,336,339,340,342,343,345,348,350,351,354,355,357,360,363,364,365,366,369,370,371,372,375,378,380,381,384,385,387,390,392,393,395,396,399,400,402,405,406,408,410,411,413,414,415,417,420,423,425,426,427,429,430,432,434,435,438,440,441,444,445,447,448,450,453,455,456,459,460,462,465,468,469,470,471,474,475,476,477,480,483,485,486,489,490,492,495,497,498,500,501,504,505,507,510,511,513,515,516,518,519,520,522,525,528,530,531,532,534,535,537,539,540,543,545,546,549,550,552,553,555,558,560,561,564,565,567,570,573,574,575,576,579,580,581,582,585,588,590,591,594,595,597,600,602,603,605,606,609,610,612,615,616,618,620,621,623,624,625,627,630,633,635,636,637,639,640,642,644,645,648,650,651,654,655,657,658,660,663,665,666,669,670,672,675,678,679,680,681,684,685,686,687,690,693,695,696,699,700,702,705,707,708,710,711,714,715,717,720,721,723,725,726,728,729,730,732,735,738,740,741,742,744,745,747,749,750,753,755,756,759,760,762,763,765,768,770,771,774,775,777,780,783,784,785,786,789,790,791,792,795,798,800,801,804,805,807,810,812,813,815,816,819,820,822,825,826,828,830,831,833,834,835,837,840,843,845,846,847,849,850,852,854,855,858,860,861,864,865,867,868,870,873,875,876,879,880,882,885,888,889,890,891,894,895,896,897,900,903,905,906,909,910,912,915,917,918,920,921,924,925,927,930,931,933,935,936,938,939,940,942,945,948,950,951,952,954,955,957,959,960,963,965,966,969,970,972,973,975,978,980,981,984,985,987,990,993,994,995,996,999,1000};
int count = 0;
for (int e : nums){
if (e <= n) count+=e;
else break;
}
return count;
}
}
结果
我的解答二(不打表):
class Solution {
public int sumOfMultiples(int n) {
int count = 0;
for (int i = 3; i <= n; i++){
if (i % 3 == 0 || i % 5 == 0 || i % 7 == 0) count+=i;
}
return count;
}
}
结果二:
我的解答三(使用公式):
class Solution {
public int sumOfMultiples(int n) {
return count(n, 3) + count(n, 5) + count(n, 7) - count(n, 15) - count(n, 21) - count(n, 35) + count(n, 105);
}
public int count(int n, int m){
return n/m*(n/m+1)/2*m;
}
}
结果
67. 二进制求和
题目
time: 2023/10/18简单题
我的解答
class Solution {
public String addBinary(String a, String b) {
if (a.length() < b.length()){
String demo = a;
a = b;
b = demo;
}
int flag = 0;
String ret = "";
for (int i = 1; i <= a.length(); i++){
int demo = 0;
if (i <= b.length()){
demo = (a.charAt(a.length()-i)-'0') + (b.charAt(b.length()-i)-'0') + flag;
ret = (demo == 1 || demo == 3) ? "1".concat(ret) : "0".concat(ret);
flag = demo > 1 ? 1 : 0;
}else{
if (flag == 1) {
demo = (a.charAt(a.length()-i)-'0') + flag;
ret = (demo == 1) ? "1".concat(ret) : "0".concat(ret);
flag = demo == 2 ? 1:0;
}else {
ret = a.substring(0, a.length()-i+1).concat(ret);
break;
}
}
}
if (flag == 1) ret = "1".concat(ret);
return ret;
}
}
结果
69. x 的平方根
使用二分法!
题目
time: 2023/10/18简单题
我的解答
class Solution {
public int mySqrt(int x) {
long left = 1;
long right = x;
long mid = 0;
if (x == 0) return 0;
else{
while(left + 1 < right){
mid = (right+left)/2;
if (mid * mid > x) right = (int) mid;
else if (mid * mid < x) left = (int) mid;
else return (int) mid;
}
return (int)left;
}
}
}
结果
70. 爬楼梯
题目
time: 2023/10/18简单题
我的解答1(打表法):
class Solution {
public int climbStairs(int n) {
int[] nums = {1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903};
return nums[n-1];
}
}
结果
我的解答2(动态规划):
class Solution {
public int climbStairs(int n) {
if (n == 1) return 1;
else if (n == 2) return 2;
else {
int a = 1;
int b = 2;
for (int i = 3; i <= n; i++){
int c = a+b;
a = b;
b = c;
}
return b;
}
}
}
结果
2525. 根据规则将箱子分类
题目
time: 2023/10/20简单题
我的解答
class Solution {
public String categorizeBox(int length, int width, int height, int mass) {
boolean a = false;
boolean b = false;
if (length / 10000 >= 1 || width / 10000 >= 1 || height / 10000 >= 1 || (long) length * width * height / 1000000000L >= 1) a = true;
b = mass >= 100;
if (a && b) return "Both";
else if (!a && !b) return "Neither";
else if (a && !b) return "Bulky";
else return "Heavy";
}
}
Tips:
int10位数左右,所以注意后面3位乘3位乘3位应该转为Long, 然后 注意常量如果为long型,后面加一个L
结果
83. 删除排序链表中的重复元素
题目
time: 2023/10/20简单题
我的解答
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode cur = head;
// 数据可能为0 所以需要判断该结点为空的情况
while (cur != null && cur.next != null){
if (cur.val == cur.next.val){
cur.next = cur.next.next;
}else cur = cur.next;
}
return head;
}
}
结果
88. 合并两个有序数组
题目
time: 2023/10/20简单题
我的解答
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if (n != 0) {
int length = m+n;
for (int i = length-1; i >= 0 && n > 0; i--){
if (m > 0){
if (nums1[m-1] > nums2[n-1]) {
nums1[i] = nums1[m-1];
m--;
}else{
nums1[i] = nums2[n-1];
n--;
}
}else{
nums1[i] = nums2[n-1];
n--;
}
}
}
}
}
结果
Tips:
这道题如果从前面往后面排序有点麻烦,但是从后面往前面反而更简单
94. 二叉树的中序遍历
题目
time: 2023/10/20简单题
我的解答(迭代):
/**
* 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 List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Deque<TreeNode> stk = new LinkedList<>();
while (root != null || !stk.isEmpty()){
while (root != null){
stk.push(root);
root = root.left;
}
root = stk.pop();
list.add(root.val);
root = root.right;
}
return list;
}
}
我的答案二(递归):
结果
2678. 老人的数目
题目
time: 2023/10/23简单题
我的解答
class Solution {
public int countSeniors(String[] details) {
int ret = 0;
for (String s : details){
int demo = (s.charAt(11)-'0') * 10 + (s.charAt(12)-'0');
ret = ret + (demo > 60 ? 1 : 0);
}
return ret;
}
}
结果
100. 相同的树
题目
time: 2023/10/25简单题
我的解答
/**
* 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 boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
else if (p == null || q == null) return false;
else {
if (p.val == q.val) return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
else return false;
}
}
}
结果
101. 对称二叉树
题目
time: 2023/10/25简单题
我的解答 根据19题可以直接得到结果:
/**
* 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 boolean isSymmetric(TreeNode root) {
TreeNode p = root.left;
TreeNode q = root.right;
return isSameTree(p, q);
}
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
else if (p == null || q == null) return false;
else {
if (p.val == q.val) return isSameTree(p.left, q.right) && isSameTree(p.right, q.left);
else return false;
}
}
}
结果
中等题
260. 只出现一次的数字 III
time: 2023/10/26中等题
题目
我的解答
class Solution {
public int[] singleNumber(int[] nums) {
int ret = 0;
for (int e : nums) ret ^= e;
ret = ret & -ret;
int[] num = new int[2];
for (int e : nums)
num[(e & ret) == 0 ? 0 : 1] ^= e;
return num;
}
}
结果
tips:
通过亦或的原理,将所有的值全部亦或可以得到两个数的亦或值,因为两个不同数亦或,一定有至少一位为1和0,所以根据这一位进行分类,生成两个数组,进而简化为有一个不同值 。
2530. 执行 K 次操作后的最大分数
题目
time: 2023/10/18中等题
我的解答
class Solution {
public long maxKelements(int[] nums, int k) {
long ret = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
for (int e : nums) pq.offer(e);
for (int i = 0; i < k; i++){
int x = pq.poll();
ret += x;
pq.offer(x/3+(x%3==0?0:1));
}
return ret;
}
}
结果
1726. 同积元组
题目
time: 2023/10/19中等题
我的解答
class Solution {
public int tupleSameProduct(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
int ret = 0;
for (int i = 0; i < nums.length; i++){
for (int j = i+1; j < nums.length; j++){
int x = nums[i] * nums[j];
if (map.containsKey(x)) {
map.put(x, map.get(x)+1);
}else map.put(x, 1);
}
}
for (int e : map.values()){
ret += e*(e-1)/2;
}
return ret << 3;
}
}
结果
小解析
本题通过hashmap的集合存储相同乘积的个数,然后通过公式计算组合数,这里使用了先拿出数据再增加。hashmap中有merge(key, value, BiFunction remappingFunction ) 所以可以这样写
class Solution {
public int tupleSameProduct(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
int ret = 0;
for (int i = 0; i < nums.length; i++){
for (int j = i+1; j < nums.length; j++){
int x = nums[i] * nums[j];
map.merge(x, 1, Integer::sum);
// 在key为x的数值上面通过后面sum方法进行1;
}
}
for (int e : map.values()){
ret += e*(e-1)/2;
}
return ret << 3;
}
}
🈲2316. 统计无向图中无法互相到达点对数
题目
time: 2023/10/21中等题
我的解答1(错误):
class Solution {
public long countPairs(int n, int[][] edges) {
HashMap<Integer, Integer> hm = new HashMap<>();
for (int i = 0; i < n; i++) hm.put(i, -1);
int count = -1;
int total = 0;
int before = 0;
long ret = 0;
int[] nums = new int[n];
for (int[] e : edges){
int a0 = hm.get(e[0]);
int a1 = hm.get(e[1]);
if (a0 == -1 && a1 == -1) {
hm.replace(e[0], ++count);
hm.replace(e[1], count);
total+=2;
nums[count]+=2;
} else if (a0 != -1 && a1 == -1) {
hm.replace(e[1], a0);
nums[a0]++;
total++;
} else if (a0 == -1) {
hm.replace(e[0], a1);
nums[a1]++;
total++;
}
}
if (total < n){
int length = n-total;
for (int i = 0; i < length; i++){
nums[++count] = 1;
total++;
}
}
for (int i = 0; i < count; i++){
total -= nums[i];
ret += (long) nums[i] * total;
before += nums[i];
}
return ret;
}
}
结果
原因
如果两组本来是分开的,因为后面一组比如[0, 5], [2, 4] 如果再来一组[0,2]这个程序不能进行改变每一个在[2, 4]组的值,所以不可取
别人解答:
class Solution {
private List<Integer>[] g;
private boolean[] vis;
public long countPairs(int n, int[][] edges) {
g = new List[n];
vis = new boolean[n];
Arrays.setAll(g, i -> new ArrayList<>());
for (var e : edges) {
int a = e[0], b = e[1];
g[a].add(b);
g[b].add(a);
}
long ans = 0, s = 0;
for (int i = 0; i < n; ++i) {
int t = dfs(i);
ans += s * t;
s += t;
}
return ans;
}
private int dfs(int i) {
if (vis[i]) {
return 0;
}
vis[i] = true;
int cnt = 1;
for (int j : g[i]) {
cnt += dfs(j);
}
return cnt;
}
}
结果
🈲1155. 掷骰子等于目标和的方法数
题目
time: 2023/10/24中等题
我的解答
class Solution {
public int numRollsToTarget(int n, int k, int target) {
if (target < n || target > n*k){
return 0;
}
int[][] memo = new int[n + 1][target - n + 1];
for (int[] m : memo) Arrays.fill(m, -1); // -1 表示没有计算过
return dfs(n, target-n, memo,k);
}
public int dfs(int i, int j, int[][] memo, int k){
if (i == 0) return j == 0 ? 1:0;
if (memo[i][j] != -1) { // 之前计算过
return memo[i][j];
}
int res = 0;
for (int x = 0; x < k && x <= j; x++) { // 掷出了 x
res = (res + dfs(i - 1, j - x, memo, k)) % 1000000007;
}
return memo[i][j] = res; // 记忆化
}
}
结果
🈲2698. 求一个整数的惩罚数
题目
time: 2023/10/25中等题
我的解答
class Solution {
private boolean dfs(String str, int index, int target) {
if (index == str.length()) {
return target == 0;
}
for (int i = index; i < str.length(); i++) {
int curr = Integer.parseInt(str.substring(index, i + 1));
// 减枝
if (target - curr < 0) {
break;
}
if (dfs(str, i + 1, target - curr)) {
return true;
}
}
return false;
}
public int punishmentNumber(int n) {
int ret = 0;
for (int i = 1; i <= n; i++){
int t = i*i;
if (dfs(t + "", 0, i)) {
ret += t;
}
}
return ret;
}
}
结果
困难题
1402. 做菜顺序
题目
time: 2023/10/23困难题
我的解答
class Solution {
public int maxSatisfaction(int[] satisfaction) {
Arrays.sort(satisfaction);
int max = 0;
int count = 1;
for (int i = 0; i < satisfaction.length; i++){
int sum = 0;
for (int j = 0; j < satisfaction.length - i; j++){
sum += (j+1)*satisfaction[j+i];
}
max = Math.max(sum, max);
}
return max;
}
}
结果