20240723
- 一、数组最后几个和字符串的两个
- 448. 找到所有数组中消失的数字(和645. 错误的集合差不多)
- 283. 移动零
- 118. 杨辉三角
- 119. 杨辉三角 II
- 661. 图片平滑器(没看懂)
- 598. 区间加法 II
- 566. 重塑矩阵
- 303. 区域和检索 - 数组不可变
- 520. 检测大写字母
- 125. 验证回文串
- 二、在Java中,将大写字符转换为小写字符的方法主要有以下几种:
一、数组最后几个和字符串的两个
448. 找到所有数组中消失的数字(和645. 错误的集合差不多)
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {int n = nums.length;int[] count = new int[n + 1]; // 1 到 n 的范围,所以数组长度为 n + 1// 记录出现的数字for (int x : nums) {count[x] = 1;}List<Integer> result = new ArrayList<>();// 查找缺失的数字for (int i = 1; i <= n; i++) {if (count[i] == 0) {result.add(i);}}return result;}
}
283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
class Solution {public void moveZeroes(int[] nums) {if(nums==null){return;}//两个指针i和jint j = 0;for(int i=0;i<nums.length;i++) {//当前元素!=0,就把其交换到左边,等于0的交换到右边if(nums[i]!=0) {int tmp = nums[i];nums[i] = nums[j];nums[j++] = tmp;}}}
}
118. 杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> ret = new ArrayList<List<Integer>>();for(int i=0;i<numRows;++i){List<Integer> row =new ArrayList<Integer>();for(int j=0;j<=i;++j){if(j==0||j==i){row.add(1);}else{row.add(ret.get(i - 1).get(j - 1) + ret.get(i - 1).get(j));}}ret.add(row);}return ret;}
}
119. 杨辉三角 II
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> row = new ArrayList<Integer>();row.add(1);for (int i = 1; i <= rowIndex; ++i) {row.add((int) ((long) row.get(i - 1) * (rowIndex - i + 1) / i));}return row;}
}
661. 图片平滑器(没看懂)
图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)
class Solution {public int[][] imageSmoother(int[][] img) {int m = img.length, n = img[0].length;int[][] ret = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {int num = 0, sum = 0;for (int x = i - 1; x <= i + 1; x++) {for (int y = j - 1; y <= j + 1; y++) {if (x >= 0 && x < m && y >= 0 && y < n) {num++;sum += img[x][y];}}}ret[i][j] = sum / num;}}return ret;}
}
598. 区间加法 II
给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。
在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。
class Solution {public int maxCount(int m, int n, int[][] ops) {int mina = m, minb = n;for (int[] op : ops) {mina = Math.min(mina, op[0]);minb = Math.min(minb, op[1]);}return mina * minb;}
}
566. 重塑矩阵
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
class Solution {public int[][] matrixReshape(int[][] nums, int r, int c) {int m = nums.length;int n = nums[0].length;if (m * n != r * c) {return nums;}int[][] ans = new int[r][c];for (int x = 0; x < m * n; ++x) {ans[x / c][x % c] = nums[x / n][x % n];}return ans;}
}
303. 区域和检索 - 数组不可变
class NumArray {int[] sums;public NumArray(int[] nums) {int n = nums.length;sums = new int[n + 1];for (int i = 0; i < n; i++) {sums[i + 1] = sums[i] + nums[i];}}public int sumRange(int i, int j) {return sums[j + 1] - sums[i];}
}
520. 检测大写字母
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如 “USA” 。
单词中所有字母都不是大写,比如 “leetcode” 。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如 “USA” 。
单词中所有字母都不是大写,比如 “leetcode” 。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。
class Solution {public boolean detectCapitalUse(String word) {// 若第 1 个字母为小写,则需额外判断第 2 个字母是否为小写if (word.length() >= 2 && Character.isLowerCase(word.charAt(0)) && Character.isUpperCase(word.charAt(1))) {return false;}// 无论第 1 个字母是否大写,其他字母必须与第 2 个字母的大小写相同for (int i = 2; i < word.length(); ++i) {if (Character.isLowerCase(word.charAt(i)) ^ Character.isLowerCase(word.charAt(1))) {return false;}}return true;}
}
125. 验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = “A man, a plan, a canal: Panama”
输出:true
解释:“amanaplanacanalpanama” 是回文串
class Solution {public boolean isPalindrome(String s) {StringBuffer sgood = new StringBuffer();int length = s.length();for (int i = 0; i < length; i++) {char ch = s.charAt(i);if (Character.isLetterOrDigit(ch)) {sgood.append(Character.toLowerCase(ch));}}StringBuffer sgood_rev = new StringBuffer(sgood).reverse();return sgood.toString().equals(sgood_rev.toString());}
}
二、在Java中,将大写字符转换为小写字符的方法主要有以下几种:
在Java中,将大写字符转换为小写字符的方法主要有以下几种:
使用Character.toLowerCase()方法:这是Java标准库提供的方法,可以将任何大写字符转换为小写字符。
` char lowerCaseChar = Character.toLowerCase('A'); // 返回 'a'`
使用String.toLowerCase()方法:如果你有一个字符串,而不是单个的字符,你可以使用这个方法将字符串中的所有大写字符转换为小写字符。
`String lowerCaseString = "HELLO WORLD".toLowerCase(); // 返回 "hello world"`
使用ASCII值进行转换:每个字符都有一个对应的ASCII值,大写字母和小写字母的ASCII值之间的差是32。所以,你可以通过添加32来将大写字符转换为小写字符。但是,这种方法只适用于英文字母。
` char ch = 'A';ch = (char) (ch + 32); // 返回 'a'`