题目链接:「新」动计划 · 编程入门
算法原理:
Q3解法:找规律
如果n能被2整除,说明n本身就是2的倍数,最小公倍数即它本身
如果n不能被2整除,那么最小公倍数就是它们的乘积
Q5解法:位运算
如果创建数组一个个存起来再去异或,那还会浪费一个数组的空间,因此我们可以直接将所有异或值存进一个int里
Q6解法:哈希表
其实最暴力的双循环一个个组合来找也能解决,但时间复杂度却是O(N²),那有没有更快的方法呢?其实有的,我们拿示例1举例,[1,2,3,1,1,3]中,第一个1能和后面2个1组合,下一个1能和后面1个1组合,组合数=1+2,那么如果1特别多呢?那就是1+2+……+n,其中n=1的总个数-1,而这个过程的求和有个固定公式:首尾相加×总个数÷2,也就是(n+1)×n/2,因此步骤如下:
①统计每个数的个数,由于数据范围只有100个,因此我们开101大小的数组比哈希表要快,下标代表对应数,一遍for循环累加个数
②从哈希表中拿出每个数出现的次数,只要次数>1就能通过组合公式(n+1)×n/2计算出组合总数
Q8解法:
注意查询时id为空也算,因此在用where筛选id!=2时后要加上 or id is null
Q10:
解法一:Java内置方法
字符串大写转小写:s.toLowerCase();
字符串小写转大写:s.toUpperCase();
解法二:手动实现
大写字母ASCII+32=小写字母ASCII
Q11解法:找规律
时间复杂度O(1)
此题博主也就只能想到循环和递归,O(1)解法是跟灵神学的,以下内容只是博主自己的推导理解而已哈
拿396举例,计算过程为:396→3+9+6=18→1+8=9
从396到9减少了396-9
=(300+90+6)-(3+9+6)
=(300-3)+(90-9)+(6-6)
=3×(100-1)+7×(10-1)
=3×99+7×9
减少量均为9的倍数,即减少量%9=0
但如果num本就是9的倍数呢?那么最终结果会减至9,而不是0
因此答案为
①num=0时,答案=0
②num%9=0时,答案=9
③num%9>0时,答案=num%9
这三条可整合成一个公式:(num-1)%9+1
Q15解法:位运算优化
①n<=0,返回false
②去除n中所有因数3
③去除n中所有因数5
④此时的n如果是丑数,必然是2的幂
Q16解法:枚举
思路很简单,把nums前半段拿出来放到新数组偶数下标位上,再把nums后半段拿出来放到新数组奇数下标位上即可
Q17解法:枚举
思路很简单,只需要将matrix的(i,j)位置的值赋值给ret的(j,i)位置即可
Q18解法:前缀和
①预处理前缀和:构建 prefix 数组,prefix[i] 表示字符串前 i+1 位(s[0..i])中 0 的总数,从左到右遍历计算 ②预处理后缀和:构建 suffix 数组,suffix[i] 表示字符串从第 i 位到末尾(s[i..n-1])中 1 的总数,从右到左遍历计算 ③遍历所有分割点:分割点在 i 和 i+1 之间,计算 prefix[i] + suffix[i+1],实时更新最大值 ④返回结果:遍历完所有分割点后,最大值即为最终答案
Q19解法:枚举
思路很简单,只要枚举[left,right]内的字符串,然后判断是否首尾字符都是元音字符然后累加即可
Java代码:
Q1
class Solution {
//0ms击败100.00%
public int sum(int num1, int num2) {
return num1+num2;
}
}
Q2
class Solution {
//0ms击败100.00%
public double[] convertTemperature(double c) {
return new double[]{c+273.15,c*1.80+32.00};
}
}
Q3
class Solution {
//0ms击败100.00%
public int smallestEvenMultiple(int n) {
return n%2==0?n:2*n;
}
}
Q4
/**
* 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 {
//0ms击败100.00%
public boolean checkTree(TreeNode root) {
return root.val==root.left.val+root.right.val;
}
}
Q5
class Solution {
//0ms击败100.00%
public int xorOperation(int n, int start) {
int ret=0;
for(int i=0;i<n;i++) ret^=start+2*i;
return ret;
}
}
Q6
class Solution {
//0ms击败100.00%
public int numIdenticalPairs(int[] nums) {
int[] hash=new int[101];
for(int x:nums) hash[x]++;
int ret=0;
for(int x:hash) ret+=(x>1?x*(x-1)/2:0);
return ret;
}
}
Q7
class Solution {
//14ms击败71.29%
public int countGoodTriplets(int[] nums, int a, int b, int c) {
int cnt=0,n=nums.length;
for(int i=0;i<n-2;i++)
for(int j=i+1;j<n-1;j++)
for(int k=j+1;k<n;k++)
if(Math.abs(nums[i]-nums[j])<=a&&
Math.abs(nums[j]-nums[k])<=b&&
Math.abs(nums[i]-nums[k])<=c)
cnt++;
return cnt;
}
}
Q8
# Write your MySQL query statement below
— 707ms击败39.54%
select name from Customer where referee_id!=2 or referee_id is null;
Q9
# Write your MySQL query statement below
— 711ms击败86.13%
select product_id from Products where low_fats = 'Y' and recyclable = 'Y';
Q10
class Solution {
//0ms击败100.00%
//解法一:Java内置方法
public String toLowerCase(String s) {
return s.toLowerCase();
}
}
class Solution {
//1ms击败39.53%
//解法二:手动实现
public String toLowerCase(String ss) {
char[] s=ss.toCharArray();
for(int i=0;i<s.length;i++)
if(s[i]>='A'&&s[i]<='Z')
s[i]=(char)(s[i]+32);
return new String(s);
}
}
Q11
class Solution {
//O(1)解法
//1ms击败83.99%
public int addDigits(int num) {
return (num-1)%9+1;
}
}
Q12
class Solution {
//0ms击败100.00%
public int subtractProductAndSum(int n) {
String s=String.valueOf(n);
int sum=0,mul=1;
for(char c:s.toCharArray()){
sum+=c-'0';
mul*=c-'0';
}
return mul-sum;
}
}
Q13
见👉A.每日一题——231. 2 的幂
Q14
见👉A.每日一题——326. 3 的幂
Q15
class Solution {
//0ms击败100.00%
public boolean isUgly(int n) {
if(n<=0) return false;
while(n%3==0) n/=3;
while(n%5==0) n/=5;
return (n&(n-1))==0;
}
}
Q16
class Solution {
//0ms击败100.00%
public int[] shuffle(int[] nums, int n) {
int[] ret=new int[2*n];
int index1=0,id=0;
for(int i=0;i<n;i++,id+=2) ret[id]=nums[i];
id=1;
for(int i=n;i<2*n;i++,id+=2) ret[id]=nums[i];
return ret;
}
}
Q17
class Solution {
//0ms击败100.00%
public int[][] transpose(int[][] matrix) {
int m=matrix.length,n=matrix[0].length;
int[][] ret=new int[n][m];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
ret[j][i]=matrix[i][j];
return ret;
}
}
Q18
class Solution {
//1ms击败98.61%
public int maxScore(String ss) {
char[] s=ss.toCharArray();
int n=s.length,ret=0;
//记录前缀和
int[] prefix=new int[n];
prefix[0]=s[0]=='0'?1:0;
//记录后缀和
int[] suffix=new int[n];
suffix[n-1]=s[n-1]-'0';
//统计前缀和
for(int i=1;i<n;i++) prefix[i]=prefix[i-1]+(s[i]=='0'?1:0);
for(int i=n-2;i>=0;i–){
//统计后缀和
suffix[i]=suffix[i+1]+s[i]-'0';
//更新结果最大值
ret=Math.max(ret,suffix[i+1]+prefix[i]);
}
return ret;
}
}
Q19
class Solution {
//1ms击败100.00%
public int vowelStrings(String[] words, int left, int right) {
int cnt=0;
for(int i=left;i<=right;i++){
//获取该字符串的长度
int n=words[i].length();
if(vowel(words[i].charAt(0))&&vowel(words[i].charAt(n-1))) cnt++;
}
return cnt;
}
//判断该字符是否是原因字符
private boolean vowel(char c){
return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';
}
}
Q20
见👉优选算法-二分:21.山峰数组的峰顶



