Java题库练习1

说明:

1. 头歌题目表述会有错误,但是测试样例一般不会出错,以测试样例为准

2. 只能在指定区间填写,所以想要调用一些函数要先看原代码有没有声明相关库,没有就自己写吧

3. 为方便以后查看和学习,所以展示题目和代码

for循环

第一关:for循环遍历字符串

题目:

根据提示,在右侧编辑器 Begin-End 区域补充代码,使用 for 循环语句实现要求的遍历字符串的功能,具体要求如下:

  • 输入一个字符串,依次输出第奇数个字符,具体查看示例;
  • 输出字符时,一个字符占一行,最后一个字符后需要换行。

注意:

1.数组从0开始,所以第奇数个字符,也就是下标为0,2,4...的字符,i+=2直接跳两个

package step1;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String inStr = input.nextLine();
        input.close();

        //请在指定位置填写代码。
        /********* Begin *********/
        for(int i = 0;i < inStr.length();i += 2){
            System.out.println(inStr.charAt(i));  //输出第i个字符
        }
        /********* End *********/

    }
}

第二关:有限状态机之开心蜗牛

根据提示,在右侧编辑器 Begin-End 区域补充代码,用有限状态机的思路实现这只开心的蜗牛,具体要求如下:

  • 输入一串由只由01组成的字符串,表示蜗牛行走的01串;

  • 输出蜗牛发出的“哈哈”笑声,即蜗牛在满足条件时发出的笑声,具体请参考测试说明给出的测试样例;

  • 输出笑声结尾不换行。

思路:顺序遍历,如果检测到0,那么检查下一个数字:若为0,则继续检查下一个,为1则开始输出“哈”;若为1,则不符合要求,跳过这一个。

注意:当可以输出“哈”的时候,说明这几位不再进行001判断,即能略微优化。

package step2;

import java.util.Scanner;

public class Main {

    final static int STATE_NO_SMALE = 0;
    final static int STATE_PREPARE_SMALE = 1;
    final static int STATE_READY_SMALE = 2;
    final static int STATE_SAMLE = 3;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String inStr = input.nextLine();
        input.close();
        assert inStr.charAt(0) == '0';
        assert inStr.charAt(1) == '0';

        // 请在指定位置填写代码。
        /********* Begin *********/
        for(int i=0;i<inStr.length();) {
                if (inStr.charAt(i) == '0') {
                    i++;
                    if (i<inStr.length()&&inStr.charAt(i) == '0') {
                        for (; i + 1 < inStr.length() && inStr.charAt(i + 1) == '1'; i++) {
                            System.out.print("哈");
                        }
                    }
                }
                else i++;
            }
        /********* End *********/

    }

}


do-while循环

第一关:指定条件输入

根据提示,在右侧编辑器 Begin-End 区域补充代码,实现要求用户输入长度不低于 6 位的密码的功能。具体要求如下:

  • 需要判断密码长度是否不低于 6 位,如果满足条件则输出字符串success!以及有效的密码作为提示,结束程序;如果不满足条件则等待用户再次输入;
  • 当用户累计输入 3 次仍不满足条件,输出提示字符串ops!,并结束程序;
  • 所有输出提示末尾都需要换行。

思路:按照题目讨论就行,注意输入3才仍不满足条件的情况!

package step1;

import java.util.Scanner;

public class Password {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int inputCount = 0;
        String password;

        //请在指定位置填写代码。
        /********* Begin *********/
        int flag=1;  //记录输入了几次
        do{
            password=input.nextLine();
            inputCount=password.length();  //长度
            if(flag<=3&&inputCount>=6) {  //输入次数不大于3次并且本次输入不小于6位
                System.out.println(password + " success!");
                break;
            }
            if(flag==4)  //输入次数为4,准备退出
                System.out.println("ops!");
            flag++;
        }while(flag<=4);
        /********* End *********/
        input.close();
    }
}

第二关:找到最高分

根据提示,在右侧编辑器 Begin-End 区域补充代码,实现一个找出最高分的简单程序。具体要求如下:

  • 首先输入一个正整数表示学生数,学生数必须是正整数,否则重新输入,直到输入正整数为止;

  • 本任务提供了一种简单的判断输入是否是正整数的方法,直接使用即可,详见最后的提示。

  • 学生数输入完毕后,依次输入相应数量的学生姓名以及分数;最后输出最高分的学生姓名及分数。

  • 输出最后不换行。

  • 测试数据中,可能会输入小数作为学生数,请注意处理。

注意:

1. Integer.parseInt(sc);是把字符串类型转换为整型

2. isNumeric(sc)只能判断是否是正整数,形参是字符串

3. 预期输出:illegal number of students! 注意此处示例与实际评测不符,评测不需要输出该句

package step2;

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String stuNumStr = "";
        int studentCount = 0;
        int maxScore = 0;
        int newScore = 0;
        String maxName = "";
        String newName = "";
        // 请在指定位置填写代码。
        /********* Begin *********/

        String sc;
        while(true) {
            sc = input.nextLine();
            if (!isNumeric(sc))  //判断正整数,注意sc只能是字符串
                continue;
            else
                break;
        }
        studentCount=Integer.parseInt(sc);  //sc字符串转换为整型
        int i=1;
        do{
            studentCount--;  //每次循环,人数减一
            newName = input.next();
            newScore= input.nextInt();
            if(newScore>maxScore){  //新数据大则最大值改变
                maxScore=newScore;
                maxName=newName;
            }
            if(studentCount==0)break;  //退出循环
        }while(true);

        /********* End *********/
        System.out.println(String.format("%s %d", maxName, maxScore));
        input.close();

    }

    public static boolean isNumeric(String str) {
        if (str.length() == 0) {
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        int i = Integer.parseInt(str);
        if(i<=0){
            return false;
        }
        return true;
    }
}


while循环

第一关:批量打印ASCII代码

根据提示,在右侧编辑器 Begin-End 区域补充代码,实现批量输出 ASCII 码中字母表的功能。具体要求如下:

  • 输入两个int类型的数,代表 ASCII 码开头和结尾的位置,代表标识范围;

  • 然后根据输入标识的范围依次输出 ASCII 码中字母部分的字符。字母表范围是从 65(A)到 90 (Z)以及从 97(a)到 122(z)的部分。输出标识范围于字母表范围重合的部分,并按 ASCII 码从小到大的顺序;

  • 输出的字符各占一行,每行先输出十进制 ASCII 码,然后输出对应字符,中间 1 个空格连接。输出末尾有换行。

注意细节

package step1;

import java.util.Scanner;

public class PrintAscii {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int begin =  input.nextInt();
        int end = input.nextInt();
        input.close();

        //请在指定位置填写代码。
        /********* Begin *********/
        if(begin < 65)   //若输入的数太小,不是字母,无需输出,则可优化
            begin = 65;
        if(end > 122)  //若输入的数太大
            end = 122;
        for(int i = begin;i <= end;i++){
            if(i > 90 && i < 97)  //不在对应的字母区间,跳过
                continue;
            System.out.printf("%d %c\n",i,(char)i);
        }
        /********* End *********/
    }
}

第二关:计算平均数

根据提示,在右侧编辑器 Begin-End 区域补充代码,实现若干整数求平均数。具体要求如下:

  • 输入若干的非 0 整数,直到输入数字 0 才认为输入结束;

  • 针对输入的若干的非零整数,输出其平均数;

  • 结果保留小数点后 2 位,末尾无换行。

话不多说

package step2;
import java.util.Scanner;

public class Mean {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Double mean = 0.0;
        int num = input.nextInt();
        int count = 0;
        Double sum = 0.0;

        //请在指定位置填写代码。
        /********* Begin *********/
        while(num != 0){
            count++;  //个数
            sum += num;  //和
            num = input.nextInt();
        }
        if(count != 0)mean = sum/count;  //平均数
        
        /********* End *********/

        System.out.print(String.format("%.2f", mean));
    }
}


switch语句

第一关:判断周末

switch 语句满足以下规则:

  • switch 表达式必须用小括号包围,并且能计算出charbyteshortint或者String类型的值;
  • case 后的值不能包含变量;
  • default 是可选的,当没有 case 与 switch 语句匹配时, 执行该操作;
  • break 语句是可选的,当执行到 break 时,立即终止 switch 语句。

从 switch 语句的规则可以总结出,switch 语句中的不同case部分其实是自上而下顺序执行的。但我们可以通过设置switch 表达式以及break语句来灵活的控制case部分的执行,这其实比使用嵌套多分支更加灵活。

话不多说

package step1;
import java.util.Scanner;

public class Weekend {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        String word = input.next();


        /********* Begin *********/
        switch(word){
            case "Saturday":
            case "Sunday": System.out.print("Weekend");break;  //周末
            case "Monday":
            case "Tuesday":
            case "Wednesday":
            case "Thursday":
            case "Friday": System.out.print("Weekday");break;  //工作日
            default:System.out.print("ops");break;  //输入错误
        }

        /********* End *********/

        input.close();
    }
}

第二关:输出年份生肖

根据提示,在右侧编辑器 Begin-End 区域补充代码,输入年份数字,输出相应的生肖。具体要求如下:

  • 输入一个int类型的数值代表年份,例如 1990 代表公元 1990 年、-226 代表公元前 226 年;
  • 输出该年份对应的生肖。例如 1990 年时,输出字符串,结尾无换行。

思路:

1. 公元前转化为公元后

2. 1900年是鼠年,为了让数字和生肖一一对应,1900%12=4,4+8=12,即一个轮回,现在(year+8)%12在year=1900时,答案为0。那么整体+1,则为1.

(year+8)%12+1的值就表示第几个生肖

3. 该题将公元0年(猴)也包含在内。(本人的思路无需考虑这个特殊情况)

package step2;
import java.util.Scanner;

public class Zodiac {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int year = input.nextInt();

        /********* Begin *********/
        while(year<0){  //公元前,则转化为公元后计算
            year+=12;
        }
        year=(year+8)%12+1;  //1900年是鼠年,那么+8,取余,+1
        //就是第几个生肖
        switch(year){
            case 1: System.out.print("鼠");break;
            case 2: System.out.print("牛");break;
            case 3: System.out.print("虎");break;
            case 4: System.out.print("兔");break;
            case 5: System.out.print("龙");break;
            case 6: System.out.print("蛇");break;
            case 7: System.out.print("马");break;
            case 8: System.out.print("羊");break;
            case 9: System.out.print("猴");break;
            case 10: System.out.print("鸡");break;
            case 11: System.out.print("狗");break;
            case 12: System.out.print("猪");break;
        }
        /********* End *********/

        input.close();
    }
}


  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值