Java openjudge javastudy 7

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]);
        	}
        }
    }
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值