目录
题目一:报时助手
题目描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
如果m为0,则将时读出来,然后加上“o'clock”,如3:00读作“three o'clock”。
如果m不为0,则将时读出来,然后将分读出来,如5:30读作“five thirty”。
时和分的读法使用的是英文数字的读法,其中0~20读作:
0:zero, 1: one, 2:two, 3:three, 4:four, 5:five, 6:six, 7:seven, 8:eight, 9:nine, 10:ten, 11:eleven, 12:twelve, 13:thirteen, 14:fourteen, 15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen, 19:nineteen, 20:twenty, 30读作thirty,40读作forty,50读作fifty。
对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirty one”。
按上面的规则21:54读作“twenty one fifty four”,9:07读作“nine seven”,0:15读作“zero fifteen”。
输入:输入包含两个非负整数h和m,表示时间的时和分。非零的数字前没有前导0。h小于24,m小于60。
输出:输出时间时刻的英文。
解题思路:
- 输入为两个非负整数,分别表示时间的时和分,由于对他们的操作和分析过程相同,则直接将他们保存在数组中,利用循环对其进行操作。
Scanner sc = new Scanner(System.in);
int[] arr = new int[2];
for(int j =0;j<2;j++) {
arr[j] = sc.nextInt();
}
对于两个数字,都考虑两种情况:<20,则直接输出对应的英文,否则需要输出其整数部分的英文+余数部分的英文。利用哈希表保存这些关系。
Map<Integer,String> map = new HashMap<Integer,String>();//创建哈希表
map.put(0, "zero");map.put(1, "one");map.put(2, "two");map.put(3, "three");
map.put(4, "four");map.put(5, "five");map.put(6, "six");map.put(7, "seven");
map.put(8, "eight");map.put(9, "nine");map.put(10, "ten");map.put(11, "eleven");
map.put(12, "twelve");map.put(13, "thirteen");map.put(14, "fourteen");
map.put(15, "fifteen");map.put(16, "sixteen");map.put(17, "seventeen");
map.put(18, "eighteen");map.put(19, "nineteen");map.put(20, "twenty");
map.put(30, "thirty");map.put(40, "forty");map.put(50, "fifty");
操作过程:
- 如果arr[i] 为0,则需要分是时为0,还是分为0。如果时为0,则输出zero,如果分为0,则输出"O'clock"。此时便需要一个变量,用来判断是时还是分。
int count = 0;//count=0时为时,=1时为分
for(int i=0;i<arr.length;i++) {
if(arr[i]==0) {
if(count==0) {//如果是时针
System.out.print(map.get(0)+" ");
}else {//是分针
System.out.print("o'clock");
}
}
2. 如果arr[i] <20,则直接输出哈希表对应元素。
else if(arr[i]<20) {
System.out.print(map.get(arr[i])+" ");
}
3. 如果能被10整除,则直接输出哈希表对应元素。
else if(arr[i]%10==0) {
System.out.print(map.get(arr[i])+" ");
}
4. 其余情况。
else {
int num1 = arr[i]/10;
int num2 = arr[i]%10;
System.out.print(map.get(num1*10)+" "+map.get(num2)+" ");
}
整体代码:
package day2_6;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main1468true {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[2];
for(int j =0;j<2;j++) {
arr[j] = sc.nextInt();
}
Map<Integer,String> map = new HashMap<Integer,String>();//创建哈希表
map.put(0, "zero");map.put(1, "one");map.put(2, "two");map.put(3, "three");
map.put(4, "four");map.put(5, "five");map.put(6, "six");map.put(7, "seven");
map.put(8, "eight");map.put(9, "nine");map.put(10, "ten");map.put(11,
"eleven");
map.put(12, "twelve");map.put(13, "thirteen");map.put(14, "fourteen");
map.put(15, "fifteen");map.put(16, "sixteen");map.put(17, "seventeen");
map.put(18, "eighteen");map.put(19, "nineteen");map.put(20, "twenty");
map.put(30, "thirty");map.put(40, "forty");map.put(50, "fifty");
int count = 0;//count=0时为时,=1时为分
for(int i=0;i<arr.length;i++) {
if(arr[i]==0) {
if(count==0) {//如果是时针
System.out.print(map.get(0)+" ");
}else {//是分针
System.out.print("o'clock");
}
}
else if(arr[i]%10==0) {
System.out.print(map.get(arr[i])+" ");
}else if(arr[i]<20) {
System.out.print(map.get(arr[i])+" ");
}else {
int num1 = arr[i]/10;
int num2 = arr[i]%10;
System.out.print(map.get(num1*10)+" "+map.get(num2)+" ");
}
count++;
}
}
}
题目二:龟兔赛跑
题目描述:
话说这个世界上有各种各样的兔子和乌龟,但是 研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔 子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以 上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1 米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找 到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入:
输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2< =100;t< =300;s< =10;l< =10000且为v1,v2的公倍数)
输出:
输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入:10 5 5 2 20
样例输出:D 4
解题思路:
- 输入。
Scanner sc = new Scanner(System.in);
int v1 = sc.nextInt();//兔子的速度
int v2 = sc.nextInt();//乌龟的速度
int t = sc.nextInt();//领先t米
int s = sc.nextInt();//休息s秒
int l = sc.nextInt();//总共的长度
int count1 = 0;//兔子的总路程
int count2 = 0;//乌龟的总路程
int time1 = 0;//兔子行驶的时间
int time2 = 0;//乌龟行驶的时间
- 当两者都未到达终点时,一直循环。如果两者之间的距离超过了t,则乌龟的路程为:count2+=s*v2,time2+=s ;否则,乌龟的路程为:count2+=v2,兔子的路程为:count1+=v1,乌龟和兔子行驶的时间各自加一:time1++,time2++
while(count1<l&&count2<l) {
if(count1-count2>=t) {
count2+=v2*s;
time2+=s;
}else {
count1 += v1;
count2 += v2;
time1++;
time2++;
}
- 在输出时,如果是同时到达,则时间为乌龟消耗的时间,因为time1是兔子在行驶的时间,而此种情况下兔子中间休息了。不是总的时间。如果是兔子赢,则输出乌龟消耗的时间,因为兔子也有可能休息了。如果是乌龟赢,直接输出乌龟到达终点所需时间。
if(count1>=l||count2>=l) {
if(count1==count2) {
System.out.println("D");
System.out.println(time2);
break;
}else if(count1>count2) {
System.out.println("R");
System.out.println(time2);
break;
}else {
System.out.println("T");
System.out.println(l/v2);
break;
}
题目三:删除数组中的0元素
题目描述:
编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接收数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。
输入时首先读入数组长度,再依次读入每个元素。
将调用此函数后得到的数组和函数返回值输出。
输入:
第一行一个数,表示数组个数
第二行为每个数字,空格分开
输出:
输出处理后的数字以及个数,各占一行
样例输入:
7 2 0 4 3 0 0 5
样例输出
2 4 3 5 4
解题思路:
循环判断数组中不为零的元素个数,记为 sum,sum 即为新数组的长度
利用循环,遍历原数组中每个元素:利用一个中间变量(布尔变量),判断元素 arr[i] 是留下还是丢弃(为零的被抛弃),如果留下,则放入新的数组中,如果抛弃则跳出此次循环(continue),继续下一个循环。
package day2_6;
import java.util.Scanner;
public class Main1479true {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] arr = new int[num];
for(int i=0;i<num;i++) {
arr[i] = sc.nextInt();
}
Main1479true main = new Main1479true();
main.CompactIntegersSingle(arr,0);
}
public void CompactIntegersSingle(int[] arr,int n) {
int sum = 0;
for(int i=0;i<arr.length;i++) {//得到新数组的长度
if(arr[i]!=n) {
sum++;
}
}
int[] arr1 = new int[sum];
int count = 0;
boolean flag = true;//作为标记变量,判断元素是否留下
for(int i=0;i<arr.length;i++) {
if(arr[i]==n)flag = false;
if(flag) {
arr1[count++]=arr[i];
}else {
flag = true;
continue;
}
}
for(int i:arr1) {
System.out.print(i+" ");
}
System.out.println();
System.out.println(count);
}
}