说明:
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 区域补充代码,用有限状态机的思路实现这只开心的蜗牛,具体要求如下:
输入一串由只由
0
和1
组成的字符串,表示蜗牛行走的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 表达式必须用小括号包围,并且能计算出
char
,byte
,short
,int
或者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();
}
}