欢迎光临
我们一直在努力

LeetCode编程入门

题目链接:「新」动计划 · 编程入门

算法原理:

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.山峰数组的峰顶

赞(0)
未经允许不得转载:171主机测评 » LeetCode编程入门
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址