java第二次小测验的题解~
1:短信计费
描述
用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送。假设已经知道你当月所发送的短信的字数,试统计一下你当月短信的总资费。
输入第一行是整数n,表示当月发送短信的总次数,接着n行每行一个整数,表示每次短信的字数。输出输出一行,当月短信总资费,单位为元,精确到小数点后1位。样例输入
10
39
49
42
61
44
147
42
72
35
46
样例输出
1.3
水题不解释
AC代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n=cin.nextInt(); double sum=0; for(int i=0;i<n;i++){ int words=cin.nextInt(); if (words <= 70) sum += 0.1; else sum += Math.ceil(1.0*words/70)*0.1; } System.out.printf("%.1f",sum); } }
2:字符串判等
描述
判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等。
输入两行,每行包含一个字符串。输出若两个字符串相等,输出YES,否则输出NO。样例输入
a A bb BB ccc CCC
Aa BBbb CCCccc
样例输出
YES
我的代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in); String str1=cin.nextLine().toLowerCase(),str2=cin.nextLine().toLowerCase(); String pd1="",pd2=""; for(int i=0;i<str1.length();i++) { if(str1.charAt(i)!=' ') { pd1+=str1.charAt(i); } } for(int i=0;i<str2.length();i++) { if(str2.charAt(i)!=' ') { pd2+=str2.charAt(i); } } if(pd1.equals(pd2)) { System.out.println("YES"); }else System.out.println("NO"); cin.close(); } }
老师的代码:使用了replaceAll替换掉空格,然后使用equalsIgnoreCase来进行不区分大小写的字符串判等。
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); String s1=sc.nextLine(); String s2=sc.nextLine(); String s11=s1.replaceAll(" ",""); String s21=s2.replaceAll(" ",""); if(s11.equalsIgnoreCase(s21)){ System.out.println("YES"); }else{ System.out.println("NO"); } } }
3:连续出现的字符
描述
给定一个字符串,在字符串中找到第一个连续出现至少k次的字符。
输入第一行包含一个正整数k,表示至少需要连续出现的次数。1 <= k <= 1000。
第二行包含需要查找的字符串。字符串长度在1到1000之间,且不包含任何空白符。输出若存在连续出现至少k次的字符,输出该字符;否则输出No。样例输入
3
abcccaaab
样例输出
c
我的代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); char cha = 0; int occur_time = 0; boolean flag=false; int times = cin.nextInt(); String str = cin.next(); for (int i = 0; i < str.length(); i++) { if (str.charAt(i) != cha) { cha = str.charAt(i); occur_time = 1; } else { occur_time++; } if (occur_time >= times) { flag=true; break; } } if(flag) System.out.println(cha); else System.out.println("No"); cin.close(); } }
老师的代码:
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); int k=sc.nextInt(); String s=sc.next(); for(int i=0;i<=s.length()-k;i++){ String t=s.substring(i,i+k); if(f(t)){ System.out.println(s.charAt(i)); return; } } System.out.println("No"); } static boolean f(String s){ for(int i=1;i<s.length();i++){ if(s.charAt(i)!=s.charAt(i-1)){ return false; } } return true; } }
4:整理药名
描述
医生在书写药品名的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式,即药品名的第一个字符如果是字母要大写,其他字母小写。如将ASPIRIN、aspirin整理成Aspirin。
输入第一行一个数字n,表示有n个药品名要整理,n不超过100。
接下来n行,每行一个单词,长度不超过20,表示医生手书的药品名。药品名由字母、数字和-组成。输出n行,每行一个单词,对应输入的药品名的规范写法。样例输入
4
AspiRin
cisapride
2-PENICILLIN
Cefradine-6
样例输出
Aspirin
Cisapride
2-penicillin
Cefradine-6
我的代码:
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n=cin.nextInt(); cin.nextLine(); while(n--!=0) { String test; test=cin.nextLine(); if(test.charAt(0)<='z'&&test.charAt(0)>='a') System.out.print(Character.toUpperCase(test.charAt(0))); else System.out.print(test.charAt(0)); for(int i=1;i<test.length();i++) { if(test.charAt(i)>='A'&&test.charAt(i)<='Z') System.out.print(Character.toLowerCase(test.charAt(i))); else System.out.print(test.charAt(i)); } System.out.println(); } } }
老师的代码:toUpperCase对于数字没有作用,不需要特判!
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); for(int i=0;i<n;i++){ String s=sc.next(); s=s.toLowerCase(); String r=(s.charAt(0)+"").toUpperCase()+s.substring(1); System.out.println(r); } } }
5:求序列中的众数
描述
输入一个长度为N的整数序列 (不多于128个整数),每个整数的范围在[-1052,1052],计算这个序列的众数。
众数是指出现次数最多的那个数。
如果有多个数出现的次数都达到最多,则取在原序列最先出现的数为众数;如果所有的数都相等,则返回"no"。
输入第一行为序列长度N。
然后是N个数,每一个数的范围都是在[-1052,1052]。 注意,这N个数之间可能有若干个空行隔开。
注意,输入数据可能有一些冗余表达信息,具体来说:
1) 正数和0前面可能有前导0和'+'符号,例如
+000123=123
+0000=0
-0000=0
2)每个数字中不含有空格和其他非数字字符,例如不会出现"100 0"或者"- 100"。
3)每个数字前面至多有一个符号,即不会出现+(-1)、-(+4)和-(-1)等情况。输出输出只有 1 行:
该序列的众数或者”no”。
如果有多个数出现的次数都达到最多,则取最先出现的数为众数,并且输出形式应该最简形式。
例如,如果原序列众数为+000123,则输出123;如果原序列众数为+0000或者-0000或者0000,输出0。
负数正常输出,例如:如果原序列众数为-000000001111,就输出-1111。样例输入
6
-00001
10000
00011111111111111111111111111111111111
-01
+000000011111111111111111111111111111111111
-00000000000001
样例输出
-1
真是哔了狗了,题目提示的表达式是可能含有冗余信息!!不是错误信息!读入的时候输入流会自动过滤的,我瞎操什么心去写过滤方法。。!
剩下的就简单了,用linkedHashMap统计出现次数,就酱。
map的相关知识点:HashMap,LinkedHashMap,TreeMap的区别
import java.math.BigInteger; import java.util.LinkedHashMap; import java.util.Scanner; import java.util.Set; public class Main { static LinkedHashMap<BigInteger,Integer> map1=new LinkedHashMap<BigInteger,Integer>(); static void f(BigInteger key){ if(map1.containsKey(key)){ map1.get(key)++; } else{ map1.put(key,1); } } public static void main(String[] args){ Scanner sc=new Scanner(System.in); int m=sc.nextInt(); for(int i=0;i<m;i++){ f(sc.nextBigInteger()); } int a=map1.size(); if(a==1){ System.out.println("no"); } else{ Set<BigInteger> keyset=map1.keySet(); int max=0; BigInteger temp=new BigInteger("0"); for(BigInteger key:keyset){ int t=map1.get(key); if(t>max){ max=t;temp=key; } } System.out.println(temp); } } }