publicstaticvoidmain(String[] args){ Scanner scanner =newScanner(System.in); int n = scanner.nextInt(); for(int line =0; line != n;++line){ for(int i =0; i <= line;++i){ System.out.printf("%d ", i); } System.out.println(); } }
}
找大写字母
本题目要求输入一个字符串,然后输出这个字符串中大写字母的个数。
输入格式
在一行中输入一个字符串。字符串长度不超过 80。
输出格式
第一行按输入顺序输出这个字符串中所有大写字母。
第二行输出这些小写字母的个数。
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
publicclassMain{
publicstaticvoidmain(String[] args)throwsIOException{ int value; int ans =0; while((value =System.in.read())!=-1&& value !='\n'){ if(Character.isUpperCase(value)){ ++ans; System.out.print((char) value); } } if(ans !=0)System.out.printf("\n%d", ans); }
publicstaticvoidmain(String[] args){ Scanner scanner =newScanner(System.in); int[] all ={135,175,518,598}; int m = scanner.nextInt(), n = scanner.nextInt(); int start =0, end =0; for(int i =0; i != all.length;++i){ if(all[i]<= m) start = i; if(all[i]<= n) end = i; } if(end - start ==0)System.out.println("Not Found"); else{ for(int i = start; i <= end;++i){ System.out.println(all[i]); } } }
publicstaticvoidmain(String[] args)throwsIOException{ int left =0, dime =0, penny =0; boolean end =false; // 读取整数部分 int ch =System.in.read(); while(Character.isDigit(ch)){ left =(left <<1)+(left <<3)+(ch ^48); ch =System.in.read(); if(ch ==-1|| ch =='\n') end =true; } if(!end){// 如果读取时没有遇到结尾,则尝试读取“角” ch =System.in.read(); if(Character.isDigit(ch)) dime = ch -'0'; else end =true; } if(!end){// 如果读取角时没有遇到结尾,则尝试读取“分” ch =System.in.read(); if(Character.isDigit(ch)) penny = ch -'0'; } Integer[] ans ={ left /10, (left %10)/5, left %10%5, dime /5, dime %5, penny >>1, penny &1 }; System.out.printf("%d 张十元\n%d 张五元\n%d 张一元\n%d 个五角\n%d 个一角\n%d 个贰分\n%d 个壹分",(Object[]) ans); }
}
数组元素移动
完成数组元素的移动功能:假设数组有 n 个元素,输入一个数x,把数组的第 x 个位置的元素先保存起来,然后把 x + 1 到 n 的元素,依次往前移一位,最后将原来的第 x 个位置的元素放在数组的最后。
重复若干次这样的移动,得到最后的结果。
输入格式
第一行包括一个整数n(1<=n<=100),表示数组元素的个数。
第二行输入n个数组元素,均为整数,用空格隔开。
第三行输入一个数k(1<=k<=100),表示要进行k次移动。
接下来k行,每行一个数x,表示要移动第x个元素。
输出格式
输出经过 k 次移动后的数组,每两个元素之间用空格隔开。
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicclassMain{
publicstaticvoidmain(String[] args){ Scanner scanner =newScanner(System.in); int n = scanner.nextInt(); List<String> list =newArrayList<>(n); for(int i =0; i != n;++i) list.add(scanner.next()); int k = scanner.nextInt(); for(int i =0; i != k;++i){ int index = scanner.nextInt()-1; String tmp = list.remove(index); list.add(tmp); } System.out.println(String.join(" ", list)); }
}
计算矩阵两个对角线之和
计算一个 n × n 矩阵两个对角线之和。
输入格式
第一行输入一个整数 n(0 < n <= 10),第二行至第 n + 1 行,每行输入 n 个整数,每行第一个数前没有空格,每行的每个数之间各有一个空格。
输出格式
输出 sum = ?,其中问号表示对角线元素之和。
题解
注意排除中间两对角线重叠部分即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicclassMain{
publicstaticvoidmain(String[] args){ Scanner scanner =newScanner(System.in); int n = scanner.nextInt(); int ans =0; for(int y =0; y != n;++y){ for(int x =0; x != n;++x){ int value = scanner.nextInt(); if(x == y) ans += value; elseif(x == n - y -1) ans += value; } } System.out.printf("sum = %d", ans); }
publicstaticvoidmain(String[] args){ Scanner scanner =newScanner(System.in); while(scanner.hasNextLine()){ String input = scanner.nextLine(); int flag =0; for(int i =0; i != input.length();++i){ if(input.charAt(i)=='(')++flag; elseif(--flag <0)break; } System.out.println(flag ==0?"YES":"NO"); } }
}
自行车停放
有 n 辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g. 停车棚里已经有 3 辆自行车,从左到右编号为:3, 5, 1。现在编号为 2 的第 4 辆自行车要停在 5 号自行车的左边,所以现在停车棚里的自行车编号是:3, 2, 5, 1)。给定 n 辆自行车的停放情况,按顺序输出最后停车棚里的自行车编号。
输入格式
第一行一个整数 n。 第二行一个整数 x。表示第一辆自行车的编号。 以下 n - 1 行,每行 3 个整数 x, y, z。 z = 0 时,表示编号为 x 的自行车恰停放在编号为 y 的自行车的左边。 z = 1 时,表示编号为 x 的自行车恰停放在编号为 y 的自行车的右边。
输出格式
从左到右输出停车棚里的自行车编号。
题解
注意最后一个数字后面要有一个空格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
publicclassMain{
publicstaticvoidmain(String[] args){ Scanner scanner =newScanner(System.in); int n = scanner.nextInt(); List<Integer> list =newArrayList<>(n); list.add(scanner.nextInt()); for(int i =1; i != n;++i){ int x = scanner.nextInt(); int y = scanner.nextInt(); int z = scanner.nextInt(); int index = list.indexOf(y); if(z ==0) list.add(index, x); else list.add(index +1, x); } list.forEach(it ->System.out.printf("%d ", it)); }
}
求迷宫最短通道
递归求解迷宫最短通道的总步长。输入一个迷宫,求从入口通向出口的可行路径中最短的路径长度。为简化问题,迷宫用二维数组int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是 n(3 < n <= 10),则该迷宫横向或纵向尺寸都是 n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2],若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0 <= i <= n - 1, 0 <= j <= n - 1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径上经历的最短的总步长。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走。
输入格式
输入迷宫大小的整数 n,以及 n 行和 n 列的二维数组(数组元素 1 代表障碍物,0 代表空位)。
publicstaticvoidmain(String[] args){ Scanner scanner =newScanner(System.in); int n = scanner.nextInt(); int[][] map =newint[n -2][n -2]; scanner.nextLine(); scanner.nextLine(); for(int i =0; i != map.length;++i){ scanner.nextInt(); for(int k =0; k != map[i].length;++k){ map[i][k]= scanner.nextInt(); } scanner.nextInt(); } int ans =bfs(map); System.out.print(ans !=Integer.MAX_VALUE? ans :"No solution"); }