深信服part1

百分号解码

牛客网
一个重复字符串是由两个相同的字符串首尾拼接而成,例如abcabc便是长度为6的一个重复字符串,而abcba则不存在重复字符串。
给定任意字符串,请帮小强找出其中的最长重复子串。
输入描述:
输入一个字符串s,其中s长度小于1e4而且只包含数字和字母。

输出描述:
输出一个整数,表示s的最长重复子串长度,若不存在则输出0
示例1
输入

xabcabcx

输出

6

从后往前遍历遇到%取后两个字符,判断是否是16进制(小写的‘a’到‘f’也算),是就将’%XX’替换’X’,并且当前遍历i不减小因为新增的字符’X’可能是’%’.

public class Main {
    Map<Character,Integer> map = new HashMap<>();
    public final void ma(){
        for (int i =0;i<=9;i++)
            map.put((char)('0'+i),i);
        for (int i='A', j=10;i<='F';i++,j++)
            map.put((char)(i),j);
        for (int i='a',j=10;i<='f';i++,j++)
            map.put((char)(i),j);

    }
    public static void main(String[] args) {
        String ss="aaa"+(char)47;
        Main test2 = new Main();
        test2.ma();
        Scanner scanner = new Scanner(System.in);
        int a;
        a = scanner.nextInt();
        scanner.nextLine(); 
        while (a > 0){
            a--;
            StringBuffer str =new StringBuffer(scanner.nextLine());
            String str2 = null;
            int length=str.length()-1;
            for (int i=length ; i>=0;i--){
                if(str.charAt(i)!='%') {
                    continue;
                }else {
                    int temporary = i;
                    int aa=0;
                    if (temporary + 2 <str.length()){
                        if (test2.map.containsKey(str.charAt(temporary+1)) &&
                            test2.map.containsKey(str.charAt(temporary+2))){
                            aa=test2.map.get(str.charAt(temporary+1))*16+test2.map.get(str.charAt(temporary+2));
                             char c=(char)aa;
                             if (c=='%') i++;
                            str.replace(temporary,temporary+3,String.valueOf(c));
                        }
                    }

                }
            }
            System.out.println(str);
        }
    }
} 

矿泉水问题

小明横穿沙漠,需要携带至少x毫升的水。
有两种规格的矿泉水可供选购:小瓶矿泉水每瓶500ml,价格a元。大瓶矿泉水每瓶1500ml,价格b元。
小明打算买一些矿泉水用于横穿沙漠,为了保证至少买到x毫升的水,小明至少需要花费多少钱?
输入描述:
第一行一个正整数t(t<=1000),表示有t组测试数据
接下来t行,每行3个正整数:x,a,b。其中x<=1,000,000,000,表示小明至少需要x毫升水;a<=100,b<=100,分别表示小瓶和大瓶矿泉水的价格,单位:元。
输出描述:
每组测试数据输出一行,表示小明最少需要花费的钱,单位:元。
示例1
输入

3
5000 5 10
4999 5 10
5000 5 100

输出

35
35
50

大瓶是小瓶容量的三倍,只要大瓶的的价格>=小瓶价格*3,全买小瓶。否则主要买大瓶,以小瓶为辅降低价格。x/1500-1 大瓶 , 那么还需要的水量从 大小瓶组合中找出最优解(感觉很不严谨 ,大哥们可以纠正我)

public class Main {
    public static void main(String[] args) {
        int t;
        Scanner scanner = new Scanner(System.in);
        t=scanner.nextInt(); 
        while (t-- > 0){
            scanner.nextLine();
            int x=scanner.nextInt();
            int a=scanner.nextInt();
            int b=scanner.nextInt();
            if(b/a >= 3 ) {
                if(x%500==0)
                    System.out.println((x/500)*a);
                else
                    System.out.println((x/500+1)*a);

            }else {
                int ss=x/1500-1;
                int mm=x - ss*1500;
                int sum=0;
                sum=mm%500==0?mm/500:mm/500+1;
                int value=b*(x/1500+1);
                for (int i = 0 ; i<=sum;i++){
                    int ak=mm;
                    ak-=500*i;
                    int ssvalue=ak%1500==0?ak/1500:ak/1500+1;
                    value=Math.min(value,ss*b+i*a+ssvalue*b);
                }
                System.out.println(value);
            } 
        }
    }
}

子数组查找

想用滑动窗口没实现成功(太菜了),暴力过了60%

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值