新计划编程入门
2235. 两整数相加
按照题意直接返回就行。
2469. 温度转换
就是将题目给的一个两位小数的非负浮点数的温度转化成开氏度和华氏度。开氏度 = 摄氏度 + 273.15; 华氏度= 摄氏度 * 1.80 + 32;
直接按照题意直接操作就行。
// 创建数组并初始化
Double[] arr = new Double[]{1.1, 2.2};
// 创建列表并初始化
List<Integer> list1 = Arrays.asList(1, 1);
ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1, 1));
2413. 最小偶倍数
注意审题,是返回2和n的最小公倍数,不是给出a和b,求a, b的最小公倍数。
如果n是奇数,就返回2n;如果n是偶数,就返回n。
求最大公约数:欧几里得算法
欧几里得算法的本质就是,用两个数中其中一个除以另外一个,如果余数不为0,则继续用除数除以余数,一直反复,直到余数为0,那最后一条式子的除数就是两个数的最大公约数。
public int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
求最小公倍数:辗转相除法
先求最大公约数,在通过两数相乘除以最大公约数得到最小公倍数
public int lcm(int a, int b) {
return a * b / gcd(a, b);
}
2236. 判断根结点是否等于子结点之和
因为刚好只有三个节点,直接按照题目判断返回就是可以。
扩展:设二叉树上有n个节点(n>=3),且每个节点都有0个或者2个子节点,要求判断除叶子节点,是否每个节点的值都等于左右儿子节点值之和。
class Solution {
public boolean dfs(TreeNode root){
if(root.left == root.right){ // 递归边界,判断root是否是叶子节点(只有当left和right都为null的时候才会想等)
return true;
}
return root.val == root.left.val + root.right.val;
}
public boolean checkTree(TreeNode root) {
return dfs(root) && dfs(root.right) && dfs(root.left); // 分别判断根、左节点、右节点
}
}
1486. 数组异或操作
比较简单的一道题,就按照题目给出逻辑用代码实现就可以。
class Solution {
public int xorOperation(int n, int start) {
int ans = 0;
for(int i = 0;i<n;i++){
int t = start + 2 * i;
ans ^= t;
}
return ans;
}
}
这里可以补充了解位运算更深层次的用法。知识点|位运算基础
1512. 好数对的数目
最容易想到的题解就是使用两次循环,在 i<j的范围里面找nums[i] == nums[j]的对数。
也可以使用map来维护nums[j]之前每个数的出现的次数。
class Solution {
public int numIdenticalPairs(int[] nums) {
int ans= 0;
Map<Integer, Integer> cnt = new HashMap<>();
for(int x: nums){
int c = cnt.getOrDefault(x, 0);
ans += c;
cnt.put(x, c+1);
}
return ans;
}
}
1534. 统计好三元组(20241210)
就是按照题目给出思路通过三重循环来求解,但是可以通过适当的剪枝来优化程序的运行时间,将条件分开判断,不用到最后在判断。
class Solution {
public int countGoodTriplets(int[] arr, int a, int b, int c) {
int cnt = 0;
int len = arr.length;
for(int i = 0;i<len;i++){
for(int j = i+1;j<len;j++){
int x = Math.abs(arr[i] - arr[j]);
if(x > a){
continue;
}
for(int k = j+1;k<len;k++){
int y = Math.abs(arr[j] - arr[k]);
if(y > b){
continue;
}
int z = Math.abs(arr[i] - arr[k]);
if(z <= c){
cnt++;
}
}
}
}
return cnt;
}
}
584. 寻找用户推荐人(20241211)
这个是一个sql语言的题。
这里需要学习的是mysql对于null的判断;mysql使用三值逻辑-TRUE、FALSE和UNKNOWN。任何与null值进行的比较都会与第三种值UNKNOWN做比较,这个任何值包括null本身,这就是为什么mysql提供了is null和is not null两种操作来对null特殊判断。
对于null字段的比较都是false;
null值和任何值的运算结构都是null;
count值为0,但是sum(null) 结果是null,出现空指针问题;
group by 中null也是一种分类,order by 中null被认为是最小值
阿里巴巴规约:
1 【强制】不要使用count(列名)或count(常数)来代替count(), count()是sql92定义的标准统计行数的语法,跟数据五福安,跟NULL和非NULL无关。count(*)会统计为NULL的行,而count(列名)不会统计次列为NULL值的行
2 【强制】count(distinct col)计算该列除NULL之外的不重复行数,注意count(distinct col1, col2)如果其中一列全是NULL,那么即使另外一列有不同的值,也返回为0
3 【强制】当某一列的值全为NULL的时候,count(col)返回的结果是0, 但是sum(col)返回的结果是NULL,因此使用sum()时要注意NPE问题。可以使用下面:
select if(isnull(sum(g)), 0, sum(g)) for table;
4 【强制】使用ISNULL()来判断是否为NULL值。说明:NULL与任何值的直接比较返回的都是NULL。
1757. 可回收且低脂的产品(20241212)
今天双十二耶。
这个题直接根据以往经验写sql就是,应该没有难度。select product_id from Products where low_fats = 'Y' and recyclable = 'Y';
1281. 整数的各位积和之差 (20241216)
直接代码模拟题目意思。
class Solution {
public int subtractProductAndSum(int n) {
// 直接模拟
int sub = 1;
int add = 0;
while(n > 0){
int t = n % 10;
sub *= t;
add += t;
n /= 10;
}
return sub - add;
}
}
231. 2 的幂(20241217)
学习幂运算的话,可以看看下面这篇文章:常用的位操作
题目给出一个n,判断这个n是不是2的指数幂。
主要的思路是:一个数如果是2的指数,那么它的二进制表示一定只含一个1
class Solution {
public boolean isPowerOfTwo(int n) {
// 一个数如果是2的指数,那么他的二进制表示一定只含一个1
if(n <= 0){
return false;
}
return (n & (n-1)) == 0; // 然后取与(两个都为1的时候才为1)
}
}
326. 3 的幂(20241217)
今天多做几道题。学习关于丑数的内容,可以参考如下文章: 一文秒杀所有丑数系列问题
题目给出一个n,判断这个n是不是3的指数幂。
对于这里题,最简单暴力的方法就是每次除以对应的值结合来判断
class Solution {
public boolean isPowerOfThree(int n) {
// 因为m的x次幂都是大于0的,所以当n == 0的时候指定是false
// 然后就是每次除以3然后判断之后的n是否等于1
while(n != 0 && n%3==0){
n /= 3;
}
return n == 1;
}
}
263. 丑数(20241217)
丑数:只包含质因数2、3和5的正整数;(通常1被让位是丑数)。
题目给出一个正整数n,判断这个数是否是丑数;所以我们只需要判断n是不是这有这三种质因子就可以了。
class Solution {
public boolean isUgly(int n) {
// 判断n是否是丑数
// 2 3 5
if(n <= 0){
return false;
}
while(n % 2 == 0){
n /= 2;
}
while(n % 3 == 0){
n /= 3;
}
while(n % 5 == 0){
n /=5;
}
return n == 1;
}
}
1470. 重新排列数组(20241217)
题目给出一个长度为2n的数组nums,将数组的数据按照规则重新排列。
创建一个指针k来表示需要插入的数据的位置,指针i和j分别指向0和n的位置,在判断k的下标是奇数还是偶数,如果是偶数就取i下标的数据,如果是奇数就去j下标的数据存入到k对应的位置,然后对应指针位置移动。
class Solution {
public int[] shuffle(int[] nums, int n) {
int[] ans = new int[2 * n];
int i =0, j = n;
for(int k = 0;k< 2*n;k++){
ans[k] = (k % 2 ==0)? nums[i++]: nums[j++];
}
return ans;
}
}
867. 转置矩阵 (20241217)
class Solution {
public int[][] transpose(int[][] matrix) {
int row = matrix.length; // 行 2
int col = matrix[0].length; // 列 3
// 转置,因为2行3列的矩阵会变成3行2列
int[][] ans = new int[col][row];
for(int i = 0;i<row;i++){
for(int j = 0;j<col;j++){
ans[j][i] = matrix[i][j];
}
}
return ans;
}
}
1422. 分割字符串的最大得分(20241218)
题目给出一个字符串s,其中只包含0和1,将字符串s分成前串和后串, 求前串中的0和后串中的1的个数的最大值。
先统计1的个数,然后在遍历整个字符串,如果是0的话,left0++, 否则right1++,求最大值。
class Solution {
public int maxScore(String s) {
char[] chars = s.toCharArray();
int right1 = 0;
for(char c: chars){
right1 += (c - '0'); // 统计1的个数
}
int ans = 0;
int left0 = 0;
for(int i = 0;i<chars.length-1;i++){
if(chars[i] == '0'){
left0++;
}
else{
right1--;
}
ans = Math.max(ans, left0+right1);
}
return ans;
}
}
需要了解的是字符之间相减是使用acill码进行操作的。
// 字符相减的实质就是获取到两个字符的unicode值,并对这两个值进行数值运算,得到他们之间的差值
// 是unicode码还是ascii码?
char a = '0';
char b = '1';
// '0' - '0' -> 0
// '1' - '0' -> 1
System.out.println('2' - '0');
System.out.println(b - '0');
System.out.println('a' - 'b');
// 97 - 65 = 32
System.out.println('a' - 'A');
2586. 统计范围内的元音字符串数(20241218)
统计[left, right]之间的字符串开头和结尾都是元音字母的字符串个数。
String.indexOf();
String.charAt(index);
class Solution {
private static final String VOWEL = "aeiou";
public int vowelStrings(String[] words, int left, int right) {
int cnt = 0;
for(int i = left;i<=right;i++){
String s = words[i];
if(VOWEL.indexOf(s.charAt(0)) != -1 && VOWEL.indexOf(s.charAt(s.length()-1)) != -1){
cnt++;
}
}
return cnt;
}
}
852. 山脉数组的峰顶索引(20241218)
典型的二分查找的题目,但是我自己在做是没有做出来, 自己只会解那种给出一个有序数组和一个带查找的值这种题。
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int left = 0,right = arr.length -1;
while(left < right){
int mid = left + (right - left)/2;
if(arr[mid] > arr[mid+1]){
right = mid;
}
else{
left = mid + 1;
}
}
return left;
}
}