蓝桥杯练习day2-6

目录

题目一:报时助手

 题目二:龟兔赛跑

题目三:删除数组中的0元素


题目一:报时助手

题目描述:给定当前的时间,请用英文的读法将它读出来。时间用时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");

操作过程:

  1. 如果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);
		
	}
	

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值