中国电信2021秋招笔试

1.求没出现重复字符的最长字串长度

(我发现每次笔试时候都来不及好好想,就只能暴力,有一些暴力也没过去)

暴力

public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        String input = cin.nextLine();
        int maxLength = 1;
        ArrayList<Character> list = new ArrayList<>();
        int index = 0;
        while (index<=input.length()-1){
            int length=0;
            list.clear();
            int j = index;
            for(;j<input.length();j++){
                if(!list.contains(input.charAt(j))){
                    length++;
                    list.add(input.charAt(j));
                }else {
                    if(length>maxLength) maxLength = length;
                    index++;
                    break;
                }
            }
            if(j>=input.length()){
                if(length>maxLength) maxLength = length;
                index++;
            }
        }
        System.out.println(maxLength);
    }

2.现在有6种杯子,其容积大小分为1 10 20 50 100 。假设水足够多,编写程序求装满体积为
N的桶(N为0~10000的非负整数)的不同组合的个数。

先贴一个暴力法只通过百分之75,其余超时的答案。(据说换成long再考虑空值可以到100%?没机会试了)

 public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] array = {100,50,20,10,5,1};
        int[] max = new int[array.length];
        for(int i=0;i<array.length;i++){
            max[i] = n/array[i];
        }
        int result = 0;
        for(int i100=0;i100<=max[0];i100++){
            if(i100 * 100 > n) break;
            for(int i50=0;i50<=max[1];i50++){
                if(i100*100+i50*50>n) break;
                for(int i20=0;i20<=max[2];i20++){
                    if(i100*100+i50*50+i20*20>n) break;
                    for(int i10=0;i10<=max[3];i10++){
                        if(i100*100+i50*50+i20*20+i10*10>n) break;
                        for(int i5=0;i5<=max[4];i5++){
                            if(i100*100+i50*50+i20*20+i10*10+i5*5>n) break;
                            for(int i1=0;i1<=max[5];i1++){
                                if(i100*100+i50*50+i20*20+i10*10+i5*5+i1>n) break;
                                result++;
                            }
                        }
                    }
                }
            }
        }
        System.out.println(result);
    }

牛客网看到的答案

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        if (n == 0) {
            System.out.println(0);
            return;
        }
        int[] v = new int[]{1, 5, 10, 20, 50, 100};
        long[] dp = new long[n + 1];
        dp[0] = 1;
        for (int i : v) {
            for (int j = i; j <= n; j++) {
                dp[j] += dp[j - i];
            }
        }
        System.out.println(dp[n]);
    }
}

3.本来是杂乱无章的一个int(比如是4 7 8 9),输入给出每个分组1 2 0 1 输出 0 1 1 2这样的非递减数列(实际就是排序)但是题里没说除了0 1 2还有别的分组!我竟然没有排序!而是去统计0 1 2 的数量 然后输出!最后只通过60% 

从题里真的看不出来 除了0 1 2还有别的组号 真是哭了

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值