一、数字统计
链接:[NOIP2010]数字统计_牛客题霸_牛客网 (nowcoder.com)
思路: 枚举+数字拆分(模10 除10)
💡 当前数据范围为10^4可以用int类型解决,如果到了10^9就需要用long类型
代码实现:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class code1
{public static void main(String[] args){Scanner in = new Scanner(System.in);int l = in.nextInt(), r = in.nextInt();int ret = 0;for(int i = l; i <= r; i++){int tmp = i;while(tmp != 0){if(tmp % 10 == 2) ret++;tmp /= 10;}}System.out.println(ret);}
}
二、两个数组的交集
链接:两个数组的交集_牛客题霸_牛客网 (nowcoder.com)
思路:哈希
💡(1)什么时候用hash:当我们遇到要快速判断一个元素是否出现集合里面的时候,就考虑哈希法
(2)本题细节1:当nums1为【2,2,2】,nums2为【2,2】时,输出的结果应该为【2】,而不是【2,2】(虽然本题没提,但是测试案例的结果是这样的)
处理方式:在加入结果的时候,从hash中删除吗;或者在加入结果之前进行判断ret中有没有2这个结果
(3)本题细节2:可以用hash但是没必要,因为数据不大,所以可以通过数组代替,这样可以提高效率(有些容器都是通过数组实现的)
处理:boolean hash 【1010】
代码实现:
import java.util.*;
public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param nums1 int整型ArrayList* @param nums2 int整型ArrayList* @return int整型ArrayList*/public ArrayList<Integer> intersection (ArrayList<Integer> nums1, ArrayList<Integer> nums2) {boolean[] hash = new boolean[1010];//能用数组就用数组ArrayList<Integer> ret = new ArrayList<>();//结果数组//把nums1里面的数都放进hash中for(int x:nums1) {hash[x] = true;}//遍历nums2哈希for(int x:nums2) {if(hash[x]) {ret.add(x);hash[x] = false;}}return ret;}
}
三、点击消除
链接:点击消除_牛客题霸_牛客网 (nowcoder.com)
思路:栈(这题类似括号匹配问题)
通过栈来做,时间和空间复杂度都为O(N)
💡细节1:如果真的用栈来做的话,最后输出字符串的时候,会是反的
处理方式:通过可变数组来模拟栈(StringBuilder即可)
细节2:如果最后字符串为空,则需输出0,而不是空
细节3:在删除栈顶元素st.deleteCharAt(st.length( )-1)时要判断st是不是为空
代码:
import java.util.Scanner;public class code3 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);char[] s = sc.next().toCharArray();//输入字符串并转为字符数组StringBuilder st = new StringBuilder();//模拟栈for (int i = 0; i < s.length; i++) {char ch = s[i];//删除字符:st得不为空if (st.length()!=0 && ch==st.charAt(st.length()-1)) {st.deleteCharAt(st.length()-1);} else {st.append(ch);}}System.out.println(st.length()==0?0:st.toString());//注意:如果是空字符串则输出0}
}