57:谁考了第k名
描述
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
输入
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的k(1≤k≤n)。
其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。
输出
输出第k名学生的学号和成绩,中间用空格分隔。(注:请用%g输出成绩)
样例输入
5 3 90788001 67.8 90788002 90.3 90788003 61 90788004 68.4 90788005 73.9
样例输出
90788004 68.4
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n, k, s;
int sno[] = new int[101];
double grade[] = new double[101];
double g;
Scanner in = new Scanner(System.in);
n = in.nextInt();
k = in.nextInt();
for (int i = 0; i < n; i++) {
sno[i] = in.nextInt();
grade[i] = in.nextDouble();
} //输入信息
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) { //比较
if (grade[j] < grade[j + 1]) { //判断成绩
g = grade[j];
grade[j] = grade[j + 1];
grade[j + 1] = g;
s = sno[j];
sno[j] = sno[j + 1];
sno[j + 1] = s;
}
}
}
System.out.println(sno[k - 1] + " " + grade[k - 1]);
}
}
58:奇数单增序列
描述
给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。
输入
共2行:
第1行为 N;
第2行为 N 个正整数,其间用空格间隔。
输出
增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。
样例输入
10 1 3 2 6 5 4 9 8 7 10
样例输出
1,3,5,7,9
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] b = new int[n];
int k = 0;
for (int i = 0; i < n; i++) {
int t = in.nextInt(); //输入数字
if (t % 2 == 1) {
b[k++] = t;
} //判断是否为奇数,是则添加进数组
}
if (k > 0) {
Arrays.sort(b, 0, k); //排序
for (int i = 0; i < k - 1; i++) {
System.out.print(b[i] + ","); //输出
}
System.out.println(b[k - 1]);
}
}
}
59:整数奇偶排序
描述
给定10个整数的序列,要求对其重新排序。排序要求:
1.奇数在前,偶数在后;
2.奇数按从大到小排序;
3.偶数按从小到大排序。
输入
输入一行,包含10个整数,彼此以一个空格分开,每个整数的范围是大于等于0,小于等于100。
输出
按照要求排序后输出一行,包含排序后的10个整数,数与数之间以一个空格分开。
样例输入
4 7 3 13 11 12 0 47 34 98
样例输出
47 13 11 7 3 0 4 12 34 98
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
List<Integer> ji = new ArrayList<Integer>();
List<Integer> ou = new ArrayList<Integer>();
for(int i=0;i<10;i++) {
int x = in.nextInt();
if(x%2==1) {
ji.add(x); //奇数为一个列表
}
else ou.add(x); //偶数为一个列表
}
Collections.sort(ou); //偶数从小到大排
Collections.sort(ji,(h1,h2)->h2.compareTo(h1)); //奇数从大到小排
for(int j:ji) {
System.out.printf(j+" ");
}
for(int o:ou) {
System.out.printf(o+" ");
}
}
}
60:整数去重
描述
给定含有n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。
输入
输入包含两行:
第一行包含一个正整数n(1 <= n <= 20000),表示第二行序列中数字的个数;
第二行包含n个整数,整数之间以一个空格分开。每个整数大于等于10、小于等于100。
输出
输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。
样例输入
5 10 12 93 12 75
样例输出
10 12 93 75
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String result = "";
String[] str = new String[n];
for(int i=0;i<n;i++) {
str[i] = sc.next();
}
List<String> list = new ArrayList<String>();
for (int i=0; i<n; i++) {
if(!list.contains(str[i])) {
list.add(str[i]); //去重
}
}
if (list != null && list.size() > 0) {
for (String item : list) {
result += item + " ";
}
result = result.substring(0, result.length() - 1);
}
System.out.println(result);
}
}
61:接水问题
描述
学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。
现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1 到 n 编号,i号同学的接水量为 wi。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 wj后,下一名排队等候接水的同学 k 马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第 x 秒结束时完成接水,则 k 同学第 x+1 秒立刻开始接水。 若当前接水人数 n’不足 m,则只有 n’个龙头供水,其它 m-n’个龙头关闭。
现在给出 n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
输入
第 1 行2 个整数 n 和 m,用一个空格隔开,分别表示接水人数和龙头个数。
第 2 行 n 个整数 w1、w2、……、wn,每两个整数之间用一个空格隔开,wi表示 i 号同学的接水量。
1 ≤ n ≤ 10000,1 ≤ m ≤ 100 且 m ≤ n;
1 ≤ wi ≤ 100。
输出
输出只有一行,1 个整数,表示接水所需的总时间。
样例输入
样例 #1: 5 3 4 4 1 2 1 样例 #2: 8 4 23 71 87 32 70 93 80 76
样例输出
样例 #1: 4 样例 #2: 163
提示
输入输出样例1解释:
第 1 秒,3 人接水。第 1秒结束时,1、2、3 号同学每人的已接水量为 1,3 号同学接完水,4 号同学接替 3 号同学开始接水。
第 2 秒,3 人接水。第 2 秒结束时,1、2 号同学每人的已接水量为 2,4 号同学的已接水量为 1。
第 3 秒,3 人接水。第 3 秒结束时,1、2 号同学每人的已接水量为 3,4 号同学的已接水量为 2。4号同学接完水,5 号同学接替 4 号同学开始接水。
第 4 秒,3 人接水。第 4 秒结束时,1、2 号同学每人的已接水量为 4,5 号同学的已接水量为 1。1、2、5 号同学接完水,即所有人完成接水。
总接水时间为 4 秒。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
for (int i = 0; i < m - n; i++) {
int minpos = minpos(a);
a[minpos] += in.nextInt();
}
System.out.println(max(a));
}
static int minpos(int[] a) {
int min = 0;
for (int i = 1; i < a.length; i++) {
if (a[i] < a[min]) {
min = i;
}
}
return min;
}
static int max(int[] a) {
int max = a[0];
for (int i = 1; i < a.length; i++) {
if (a[i] > max) {
max = a[i];
}
}
return max;
}
}
62:二进制分类
描述
若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A类数,否则就称其为B类数。
例如:
(13)10 = (1101)2,其中1的个数为3,0的个数为1,则称此数为A类数;
(10)10 = (1010)2,其中1的个数为2,0的个数也为2,称此数为B类数;
(24)10 = (11000)2,其中1的个数为2,0的个数为3,则称此数为B类数;
程序要求:求出1~1000之中(包括1与1000),全部A、B两类数的个数。
输入
无。
输出
一行,包含两个整数,分别是A类数和B类数的个数,中间用单个空格隔开。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a=0,b=0;
for (int i = 1; i < 1001; i++) {
String s = Integer.toString(i, 2);
if (isA(s)) {
a++;
}
else{
b++;
}
}
System.out.println(a+" "+b);
}
static boolean isA(String s){
int a1=0,a0=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='1'){
a1++;
} else if (s.charAt(i) == '0') {
a0++;
}
}
return a1>a0;
}
}
63:画矩形
输入
输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为1或0,0代表空心,1代表实心。
输出
输出画出的图形。
样例输入
7 7 @ 0
样例输出
@@@@@@@ @ @ @ @ @ @ @ @ @ @ @@@@@@@
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
String c = in.next();
int d = in.nextInt();
if (d == 1) {
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++)
System.out.print(c);
System.out.println();
}
} else {
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
if ((i == 1) || (i == a) || (j == 1) || (j == b))
System.out.print(c);
else
System.out.print(" ");
}
System.out.println();
}
}
}
}
64:敲七
描述
输出7和7的倍数,还有包含7的数字。例如(17,27,37...70,71,72,73...)
输入
一个整数N。(N不大于30000)
输出
从小到大排列的不大于N的与7有关的数字,每行一个。
样例输入
20
样例输出
7 14 17
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i=1;i<=n;i++)
{
if(i%7==0||i%10==7||i/10%10==7||i/100%10==7||i/1000%10==7)
System.out.println(i);
}
}
}
66:等比数列末项计算
描述
已知等比数列的公比是2,现给出等比数列的第一项a1,求第n项是多少?
输入
一行,包含三个整数a1,n。-100 <= a1<= 100,0 < n <= 63。
输出
一个整数,即第n项的值。
样例输入
1 3
样例输出
4
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
BigInteger a=in.nextBigInteger(); //int位数不够
int n=in.nextInt();
for(int i=1;i<=n-1;i++){
a=a.multiply(new BigInteger("2"));
}
System.out.println(a);
}
}
67:矩阵交换行
描述
编写一个函数,输入参数是5*5的二维数组,和n,m两个行下标。功能:判断n,m是否在数组范围内,如果不在,则返回0;如果在范围内,则将n行和m行交换,并返回1。
在main函数中, 生成一个5*5的矩阵,输入矩阵数据,并输入n,m的值。调用前面的函数。如果返回值为0,输出error。如果返回值为1,输出交换n,m后的新矩阵。
输入
5*5矩阵的数据,以及n和m的值。
输出
如果不可交换,则输出error;
如果可交换,则输出新矩阵
样例输入
1 2 2 1 2 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 3 0 8 2 4 0 4
样例输出
3 0 8 2 4 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 1 2 2 1 2
import java.util.*;
public class Main
{
public static boolean check(int a, int b)
{
if((a>=0&&a<=4)&&(b>=0&&b<=4))
return true;
return false;
}
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int[][] num = new int[11][11];
for(int i = 0; i <= 4; i++)
{
for(int j = 0; j <= 4; j++)
num[i][j] = in.nextInt();
}
int n = in.nextInt();
int m = in.nextInt();
if(check(n,m))
{
for(int j = 0; j <= 4; j++)
{
int tmp = num[n][j];
num[n][j] = num[m][j];
num[m][j] = tmp;
}
for(int i = 0; i <= 4; i++)
{
for(int j = 0; j <= 4; j++)
System.out.printf("%4d", num[i][j]);
System.out.println();
}
}
else
System.out.println("error");
}
}
68:字符串hash
描述
给定N个单词(每个单词长度不超过100,单词字符串内仅包含小写字母)。
请求出N个单词中共有多少个不同的单词。
输入
第1行包含1个正整数N。
接下来N行每行包含一个字符串。
输出
一个整数,代表不同单词的个数
样例输入
5 lalala hahaha haha lalala haha
样例输出
3
import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String s;
Set<String> hashset = new HashSet<String>();
for(int i=0;i<n;++i) {
s= in.next();
hashset.add(s);
}
System.out.println(hashset.size());
}
}
69:蛇形填充数组
描述
用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。
蛇形填充方法为:
对于每一条左下-右上的斜线,从左上到右下依次编号1,2,...,2n-1;按编号从小到大的顺序,将数字从小到大填入各条斜线,其中编号为奇数的从左下向右上填写,编号为偶数的从右上到左下填写。
比如n=4时,方阵填充为如下形式:
1 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16
输入
输入一个不大于10的正整数n,表示方阵的行数。
输出
输出该方阵,相邻两个元素之间用单个空格间隔。
样例输入
4
样例输出
1 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] a = new int[n + 5][n + 5];
for (int sum = 1, i = 1, j = 1; sum <= n * n;) {
if ((i + j) % 2 == 0) {
a[i][j] = sum;
sum++;
if (i == 1 && j != n)
j++;
else if (j == n)
i++;
else {
i--;
j++;
}
} else {
a[i][j] = sum;
sum++;
if (j == 1 && i != n)
i++;
else if (i == n)
j++;
else {
i++;
j--;
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (j == 1)
System.out.print(a[i][j]);
else
System.out.print(" " + a[i][j]);
}
System.out.println();
}
}
}
70:反反复复
描述
Mo和Larry发明了一种信息加密方法。他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各列,并在末尾补充一些随机字母使其成为一个完整的字母矩阵。例如,若信息是“There's no place like home on a snowy night”并且有5列,Mo会写成:
t o i o y h p k n n e l e a i r a h s g e c o n h s e m o t n l e w x
注意Mo只会填入字母,且全部是小写形式。在这个例子中,Mo用字母“x”填充了信息使之成为一个完整的矩阵,当然他使用任何字母都是可以的。
Mo根据这个矩阵重写信息:首先从左到右写下第一行,然后从右到左写下第二行,再从左到右写下第三行……以此左右交替地从上到下写下各行字母,形成新的字符串。这样,例子中的信息就被加密为:toioynnkpheleaigshareconhtomesnlewx。
你的工作是帮助Larry从加密后的信息中还原出原始信息(包括填充的字母)。
输入
第一行包含一个整数(范围2到20),表示使用的列数。
第二行是一个长度不超过200的字符串。
输出
一行,即原始信息。
样例输入
5 toioynnkpheleaigshareconhtomesnlewx
样例输出
theresnoplacelikehomeonasnowynightx
import java.util.Scanner;
import java.math.*;
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n = in.nextInt(); //lie
String str = in.next();
int m = (int)Math.ceil(str.length()/(double)n); //hang
char [][] a = new char[m][n];
char [][] b = new char[m][n];
char[] x=str.toCharArray();
int k = 0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++) {
a[i][j] = x[k++];
}
}
for(int i=0;i<m;i++) {
if(i%2==0) {
for(int j=0;j<n;j++) {
b[i][j]=a[i][j];
}
}
if(i%2!=0) {
for(int j=0;j<n;j++) {
b[i][j] = a[i][n-j-1];
}
}
}
for(int j=0;j<n;j++) {
for(int i=0;i<m;i++) {
System.out.print(b[i][j]);
}
}
}
}