CCF CSP认证JAVA(二)

201709-1打酱油

问题描述

小明带着N元钱去买酱油。酱油10块钱一瓶,商家进行促销,每买3瓶送1瓶,或者每买5瓶送2瓶。请问小明最多可以得到多少瓶酱油。

输入格式

输入的第一行包含一个整数N,表示小明可用于买酱油的钱数。N是10的整数倍,N不超过300。

输出格式

输出一个整数,表示小明最多可以得到多少瓶酱油。

样例输入

40

样例输出

5

//100
public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int num= n/10;
        int n1 = n/50;
        int rest = n - n1*50;
        if(n1>0){
            num = num+2*n1+rest/30;
        }else {
            num = num+n/30;
        }
        System.out.println(num);
    }
}

201612-1中间数

问题描述

在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
  给定一个整数序列,请找出这个整数序列的中间数的值。

输入格式

输入的第一行包含了一个整数n,表示整数序列中数的个数。
  第二行包含n个正整数,依次表示a1, a2, …, an

输出格式

如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。

样例输入

6
2 6 5 6 3 5

样例输出

5

思路:利用Arrays.sort(arr);将数组排序,再计算左边的和右边的,如果相对就返回中间值,否则返回-1.

//100分
public class Demo4 {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i]= scanner.nextInt();
        }
        Arrays.sort(arr);
        int mid = n/2;
        int left = mid,right = n-mid-1;
        int m1=mid-1, m2= mid+1;
       for(int i = m1;i>=0;i--){
           if(arr[i]==arr[mid]){
               left--;
           }
           else {break;}
       }
       for(int i = m2;i<n;i++){
           if(arr[i]==arr[mid]){
               right--;
           }
           else {break;}
       }
       if(left==right){
           System.out.println(arr[mid]);
       }else {
           System.out.println("-1");
       }
    }
}

201509-3模板生成系统

在这里插入图片描述

这题真的废了好大功夫!!!

思路

  1. 用字符串数组来存储各行模板;
  2. 用key-value来存储变量与变量值(注意空格,引号的处理);
  3. 由于题目中提到:“模板不递归生成。也就是说,如果变量的值中包含形如 {{ VAR }} 的内容,不再做进一步的替换。”所以需要做二次替换,也就是说,如果需要替换的变量值中仍然存在{{ VAR }}格式,则先将其替换为中间值(我这里采用加前缀的方式),为了避免中间值在输入中已出现,最后在这行替换完成后,将储存的中间值替换掉;
  4. 用变量的存储的值来替换原文中每一句包含该变量的成分并进行输出。
public class Main {

    public static void main(String[] args) {
        //输入
        Scanner input = new Scanner(System.in);
        int n=input.nextInt();//模板行数
        int m=input.nextInt();//变量行数
        input.nextLine();
        //模板
        String[] template = new String[n];
        for(int i=0;i<n;i++){
            template[i]=input.nextLine();
        }
        //变量
        Map<String,String> values = new HashMap<String ,String >();
        for(int i=0;i<m;i++){
            String key = input.next();
            String value = input.nextLine().trim();//去两端空格
            value=value.substring(1,value.length()-1);//去引号
            values.put(key,value);
        }
        input.close();//关闭输入流,释放内存
        //处理
        Map<String ,String > second = new HashMap<String ,String >();
        for(int i=0;i<n;i++){
            String str = template[i];
            //使用迭代器进行遍历
            Iterator<Map.Entry<String,String>> iterator = values.entrySet().iterator();
            //Map中有的:
            while (iterator.hasNext()){
                Map.Entry<String ,String> e = iterator.next();
                //变量的值中包含形如 {{ VAR }} 的内容
                if(e.getValue().matches(".*\\{{2}\\s.+\\s\\}{2}.*")){
                    String secondKey = "steven"+e.getKey();
                    str=str.replace("{{ "+e.getKey()+" }}",secondKey);//加前缀
                    second.put(secondKey,e.getValue());
                }else {//变量的值中包含形如 {{ VAR }} 的内容,直接进行替换即可
                    str=str.replace("{{ "+e.getKey()+" }}", e.getValue());
                }
            }
            //Map中没有的:
            str=str.replaceAll("\\{{2}\\s.+\\s\\}{2}","");
            //处理中间值
            Iterator<Map.Entry<String ,String >> iterator1 = second.entrySet().iterator();
            while (iterator1.hasNext()){
                Map.Entry<String ,String > e2 = iterator1.next();
                str = str.replace(e2.getKey(),e2.getValue());
            }
            System.out.println(str);        }
    }
}

//输入
11 2
<!DOCTYPE html>
<html>
<head>
<title>User {{ name }}</title>
</head>
<body>
<h1>{{ name }}</h1>
<p>Email: <a href="mailto:{{ email }}">{{ email }}</a></p>
<p>Address: {{ address }}</p>
</body>
</html>
name "David Beckham"
email "david@beckham.com"
//输出
<!DOCTYPE html>
<html>
<head>
<title>User David Beckham</title>
</head>
<body>
<h1>David Beckham</h1>
<p>Email: <a href="mailto:david@beckham.com">david@beckham.com</a></p>
<p>Address: </p>
</body>
</html>

基础知识

创建:

  • String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了,如果需要对字符串做很多修改,那么应该选择使用StringBuffer、StringBuilder类。

    String s1 = "Hello";  
    String str2=new String("hello");
    StringBuffer s =new StringBuffer(内容);//创建带内容的字符buffer对象
    StringBuilder x = new StringBuilder();//创建一个可变的string类型
    

int 与 char相互转换

  1. int类型转char类型,将数字加一个‘0’,并强制类型转换为char即可。
  2. char类型转int类型,将字符减一个‘0’即可。

标准ASCII中,48~57为0到9十个阿拉伯数字;65~90为26个大写英文字母;97~122号为26个小写英文字母。

// '1' -> 1
char c9 = '1';
int num9 = c9 - '0';
// 1 -> '1'
int num10 = 1;
char c10 = (char)(num10 + '0');

char与string互相转换

  • String 转 char :

    1. 使用 String.charAt( index ) 方法,返回在index位置的char字符。(返回值:char )
    2. 使用 String.toCharArray( ) 方法,将String 转化为 字符串数组。(返回值:char[] )
  • char 转 String:

    //1.效率最高得到一种方法
     String s = String.valueOf('c');
    
    //2.将字符串数组转化为字符串
    String s = String.valueOf(new char[] {'G','e','o','o','o'});
    
    //3.用 Character 的 toString(char) 方法  ==>  实际上还是调用了String.valueOf(char)
    String s = Character.toString('c');
    
    //4.new 一个 Character 调用 toString()
    String s = new Character('c').toString();
    
    //5.直接用 空 String 拼接 'c'
    String s = "" + 'c' ;
    
    //第5种方法最简单但效率最低,因为String类是 final 属性
    // "" + 'c' 时候需要创建新的 String 类 ,如果进行很多次拼接则要创建很多个类虚拟机栈可能会溢出
    

替换

  • replace()
public String replace(char oldChar, char newChar) 
// 在字符串中用newChar字符替代oldChar字符,返回一个新的字符串
  • replaceAll()
public String replaceAll(String regex,String replacement)
//使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。
    //例如:
replaceAll("\\d", "*")//把一个字符串所有的数字字符都换成星号;
  • replaceFirst()

也是基于规则表达式的替换,但与replaceAll()不同的是,只替换第一次出现的字符串。

注意转义字符’'的使用

//把字符串中的反斜杠(\)替换成(\\)
//replaceAll里面用的是正则表达式,(正则表达式里面"\\"表示一个"\"),所以字符串转义一次,正则转义一次,所以一个斜扛要写4个
replaceAll( "\\\\ ",   "\\\\\\\\ ");

Scanner实现字符串的输入

  • next():一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
  • nextLine():结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
trim() 方法用于删除字符串的头尾空白符。

正则表达式语法

  • 在其他语言中,\\表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

  • 在 Java 中,\\表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

  • 所以,在其他的语言中(如 Perl),一个反斜杠就足以具有转义的作用,而Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。

Java 正则表达式 | 菜鸟教程 (runoob.com)

里面有一个表,有具体的正则表达式的语法,需要的时候可以看一下!


今日推歌

—《愚不可及》

上演一出默剧
我和你很默契
在维系
这摇摇欲坠的风景
是我太愚不可及
还妄想你还是你
用续集粉饰悲剧
欺骗自己
是我太愚不可及
你已叛离成回忆
我却像换季的大雨
从未忘记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星回昭以烂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值