这个周末花了两天才写了五道题,嘿嘿!康康吧!
题目链接
题目描述:
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:
给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入描述:
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空
格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出描述:
在一行中输出能够组成的最小的数。
输入例子:
2 2 0 0 0 3 0 0 1 0
输出例子:
10015558
分析:
输入一串10个数字,依次从0到9,在0位输入2,就是有2个0,在1位置输入2,就是有两个1,以此类推。存入到一个字符串00115558,然后按最小排序输出。
ac代码为:
import java.util.Scanner;
public class Niuk1013 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] a = new int[10];
String str = "",str2 = "";
int b=0,c=0;
for(int i=0;i<10;i++){
a[i] = scan.nextInt();
}
for (int j=0;j<10;j++){
if(a[j]==0){ }//如果输入的数为0,则继续
else {
for(int k=0;k<a[j];k++){
str =str+j; //把数存进字符串里2 2 0 0 0 3 0 0 1 0
b++; //统计有多少位数 00115558
}
}
}
//00225558 20025558
for(int i=0;i<b;i++) {
char ch = str.charAt(i);
if(ch!='0'){
str2 = str.charAt(i) + str.substring(0,i)+str.substring(i+1);
break;
}
}
System.out.println(str2);
}
}
题目链接
题目描述:
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[±][1-9]"."[0-9]+E[±][0-9]+,即数字的整数部分
只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。
输入描述:
每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。
输出描述:
对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
输入例子:
+1.23400E-03
输出例子:
0.00123400
分析:
首先先把E前后的字符存到字符串中,然后处理好正负号,理解前后正负号的差异,再进行做题。在字符串中插入字符,我用了StringBuilder。
ac代码为:
import java.util.Scanner;
public class Niuk1014 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
String[] str2 = str.split("E");
String str3 = "", str4 = "";
char t = 0;
//遍历E前面的
for (int i = 0; i < str2[0].length(); i++) {
char ch = str2[0].charAt(i);
if (ch != '.' && ch != '+' && ch != '-') {
str3 = str3 + ch; //
}
}
//遍历E后面的
//+1.23400E-03 0.00123400
//+1.23400E+03 123.400
for (int i = 0; i < str2[1].length(); i++) {
char ch2 = str2[1].charAt(i);
if (ch2 != '+' && ch2 != '-') {
str4 = str4 + ch2;
} else t = ch2;
}
//-1.23400E-03 str3=-123400 -0.00123400
int f = Integer.parseInt(str4);//E后面的数值
char ch3 = str.charAt(0);//获取正负号
boolean jud = true;
if(ch3=='-')jud=false;//int a=0
if (t == '+') {
if (f < str3.length()) {
StringBuilder sb = new StringBuilder(str3);
sb.insert(f, ".");
str3= sb.toString();
}
else {
int x = f - str3.length()+1;
for (int i = 0; i < x; i++) {
str3 = str3 + "0";
}
}
}
else if (t == '-') {
for (int i = 0; i < f; i++) {
str3 = "0" + str3;
}
StringBuilder sb = new StringBuilder(str3);
sb.insert(1, '.');
str3=sb.toString();
}
//jud==false;
if(!jud)
{str3="-"+str3;}
System.out.println(str3);
}
}
题目链接
题目描述:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递
增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入描述:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出描述:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入例子:
19 *
输出例子:
*****
***
*
***
*****
2
分析:
作一个循环,符号相加如果大于输入的数值,则break,否则算出有多少层,和完整漏斗符号多少。三个for循环来输出上部分的符号和空格。
ac代码为:
import java.util.Scanner;
public class Niuk1017 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String str = scan.next();
int sum=-1,gip=0,b=0;
for(int i=1;;i++){
sum = sum+(i*2-1)*2;//从1加到两侧
if(sum>n){
break;
}
gip++;
b=sum;
}
//上半部分有gip层
//*****
// ***
// *
for(int i=gip;i>0;i--){
//输出空隔
for(int j=gip-i;j>0;j--){
System.out.print(" ");
//输出字符
}
for(int k=1;k<=2*i-1;k++){
System.out.print(str);
}
System.out.println();
}
//下部分
for(int i=2;i<=gip;i++){
//输出空隔
for(int j=gip-i;j>0;j--){
System.out.print(" ");
//输出字符
}
for(int k=1;k<=2*i-1;k++){
System.out.print(str);
}
System.out.println();
}
System.out.print(n-b);
}
}
题目链接
题目描述:
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200
岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入描述:
输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及
按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出描述:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入例子:
5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20
输出例子:
3 Tom John
分析:
先存入合理人的信息,再从合理的人中判断最年长人和最年轻人。
ac代码为:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Niuk1018 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
scan.nextLine();
int flag=0;
int max=1814, min =2014;
String Maxname="",Minname="";
for(int i=0;i<n;i++){
String str = scan.nextLine();
String[] str2 = str.split(" ");
Map<String,String> map1=new HashMap<>();
int a = Integer.parseInt(str2[1].substring(0,4));
int b = Integer.parseInt(str2[1].substring(5,7));
int c = Integer.parseInt(str2[1].substring(8));
//判断有多少个人合理
if(a>1814&&a<2014) {
flag++;
map1.put(str2[0],str2[1]);
}else if(a==1814){
if(b==9&&c>=6){flag++;map1.put(str2[0],str2[1]);}
else if(b>9){flag++;map1.put(str2[0],str2[1]);}
}else if(a==2014){
if(b==9&&c<=6){flag++;map1.put(str2[0],str2[1]);}
else if(b<9){flag++;map1.put(str2[0],str2[1]);}
}
for(String tmp:map1.keySet()){
int a2 = Integer.parseInt(map1.get(tmp).substring(0,4));
if(a2>=max){
max = a2;
Maxname = tmp;
}
if(a2<=min){
min = a2;
Minname = tmp;
}
}
}
System.out.print(flag+" "+Minname+" "+Maxname);
}
}
题目链接
题目描述:
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出
肯定坏掉的那些键。
输入描述:
输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、
以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。
输出描述:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。
输入例子:
7_This_is_a_test
_hs_s_a_es
输出例子:
7TI
分析:
把实际输入的文字存到set()里面,去除重复的字符,把应该输入的文字和set里面的字符比较,再和list比较,list是用来存入坏掉键的字符。如果set里无,list里无,则存入list。(list可排序)
ac代码为:
import java.util.*;
public class Niuk1019 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine().toUpperCase();
String str2 = scan.nextLine().toUpperCase();
//7_This_is_a_test a串 从a串中找到B串没有的字符。 并且按顺序找一次 list<>7 t i
//_hs_s_a_essssssssssse b串 set<> t2{_,h,s,a,e}
List<String> list = new ArrayList<>();
Set<String> set2=new HashSet<>();
//7_This_is_a_test
//第二个字符串
for(int i=0;i<str2.length();i++){
set2.add(str2.charAt(i)+"");
}
for(int i=0;i<str.length();i++){
char ch = str.charAt(i);
if(!set2.contains(ch+"")){
if(!list.contains(ch+"")){
list.add(ch+"");
}
}
}
for(String tmp:list) {
System.out.print(tmp);
}
}
}