【笔试强训】数字统计|两个数组的交集|点击消除

一、数字统计

链接[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
    }
}

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深鱼~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值