172、阶乘后的零
给定一个整数 n
,返回 n!
结果中尾随零的数量。
详细通俗的思路分析 - 阶乘后的零 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public int trailingZeroes(int n) {
int ans=0;
while(n>0){
n/=5;
ans+=n;
}
return ans;
}
}
682、棒球比赛
class Solution {
public int calPoints(String[] ops) {
int ans[] = new int[ops.length];
int j=0;
for (int i = 0; i < ops.length;i++ ) {
switch (ops[i]) {
case "+":
ans[j] = ans[j - 1] + ans[j - 2];
j++;
break;//退出switch循环
case "D":
ans[j] = ans[j - 1] * 2;
j++;
break;
case "C":
ans[j - 1] = 0;
j--;
break;
default:
ans[j] = Integer.valueOf(ops[i]);
j++;
break;
}
}
int sum = 0;
for (int i = 0; i < ans.length; i++) {
sum += ans[i];
}
return sum;
}
}
90、子集 II
不重复的知识点——40组合总和II
class Solution {
List<List<Integer>> ans=new ArrayList<>();
List<Integer>path=new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
ans.add(new ArrayList<>());
//这一行加上if(i>startIndex&&nums[i-1]==nums[i]) continue;构成不重复
Arrays.sort(nums);
backtracking(nums,0);
return ans;
}
public void backtracking(int []nums,int startIndex){
if(startIndex==nums.length){
return ;
}
for(int i=startIndex;i<nums.length;i++){
if(i>startIndex&&nums[i-1]==nums[i]) continue;//这一行加上Arrays.sort(nums);构成不重复
path.add(nums[i]);
ans.add(new ArrayList<>(path));
backtracking(nums,i+1);
path.remove(path.size()-1);
}
}
}
93、复原 IP 地址
判断是否子串是否合法
- 段位以0为开头的数字不合法
- 段位里有非正整数字符不合法
- 段位如果大于255了不合法
backtracking(s,i+2,pointNum);//i+2是因为s里面加了一个分隔符. 而这个分隔符并不是我们要处理的
class Solution {
List<String>path=new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
if(s.length()<4||s.length()>12) return path;
backtracking(s,0,0);
return path;
}
public void backtracking(String s,int startIndex,int pointNum){
if(pointNum==3){//分成4段,有3个.
// 逗点数量为3时,分隔结束
// 判断第四段子字符串是否合法,如果合法就放进result中
if(isValid(s,startIndex,s.length()-1)){
path.add(s);
}
return ;
}
for(int i=startIndex;i<s.length();i++){
if(isValid(s,startIndex,i)){
s=s.substring(0,i+1)+"."+s.substring(i+1);//2.5525511135
pointNum++;
backtracking(s,i+2,pointNum);//i+2是因为s里面加了一个分隔符. 而这个分隔符并不是我们要处理的
pointNum--;
s=s.substring(0,i+1)+s.substring(i+2);//变回25525511135即回溯删掉逗点
System.out.println(s);
}else{
continue;
}
}
}
public boolean isValid(String s,int start,int end){
//判断[start,end]里是否合法
if(start>end) return false;
//0开头的不合法 排除0.0.0.0这种情况start!=end
if(s.charAt(start)=='0'&&start!=end) return false;
int num=0;
for(int i=start;i<=end;i++){
if(s.charAt(i)>'9'||s.charAt(i)<'0') return false;//遇到非数字的排除
num=num*10+(s.charAt(i)-'0');
if(num>255) return false;//大于255的排除
}
return true;
}
}