寒假07:字符串变换、P1102、P1101

算法训练 字符串变换  
时间限制:1.0s   内存限制:256.0MB     
问题描述
  相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了。今天,徐老师想测试一下大家对于字符串操作的掌握情况。徐老师自己定义了1,2,3,4,5这5个参数分别指代不同的5种字符串操作,你需要根据传入的参数,按照徐老师的规定,对输入字符串进行格式转化。
  徐老师指定的操作如下:
  1 表示全部转化为大写字母输出,如abC 变成 ABC
  2 表示全部转换为小写字母输出,如abC变成abc
  3 表示将字符串整个逆序输出,如 abc 变成 cba
  4 表示将字符串中对应的大写字母转换为小写字母,而将其中的小写字母转化为大写字母输出,如 abC变成ABc
  5表示将全部转换为小写字母,并将其中所有的连续子串转换为对应的缩写形式输出,比如abcD 转换为a-d,其次,-至少代表1个字母,既如果是ab,则不需要转换为缩写形式。
输入格式
  一共一行,分别是指代对应操作的数字和字符串,两者以空格分隔,字符串全部由英文字母组成
输出格式
  输出根据上述规则转换后对应的字符串
样例输入
5 ABcdEE
样例输出
a-ee
数据规模和约定
  输入字符串长度最长为200。
这个题比较简单,会字符串大写和小写转换的两个方法就没什么问题了。主要是第五种情况还是有点麻烦的,需要细心点。

代码:

import java.util.Scanner;

public class 字符串变换 {

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		
		while(sc.hasNext()){
			int n=Integer.parseInt(sc.next());
			String s=sc.next();
			
			switch (n) {
			case 1:
				System.out.println(s.toUpperCase());
				break;
			case 2:
				System.out.println(s.toLowerCase());
				break;
			case 3:
				for (int i = s.length()-1; i >= 0; i--) {
					System.out.print(s.charAt(i));
				}
				break;
			case 4:
				for (int i = 0; i < s.length(); i++) {
					if(s.charAt(i)>=97&&s.charAt(i)<=122){
						System.out.print((char)(s.charAt(i)-32));
					}else if(s.charAt(i)>=65&&s.charAt(i)<=90){
						System.out.print((char)(s.charAt(i)+32));
					}
				}
				break;
			case 5:
				s=s.toLowerCase();
				String re=s.charAt(0)+"";
				char a=s.charAt(0);
				int count=0;
				if(s.length()==2){
					System.out.println(s);
					return;
				}
				for (int i = 1; i < s.length(); i++) {
					if(s.charAt(i)-a==1){
						count++;
					}else{
						if(count>1){
							re+="-";
							re+=s.charAt(i-1);
						}
						re+=s.charAt(i);
						count=0;
					}
					a=s.charAt(i);
				}
				if(count>1){
					re+="-";
					re+=s.charAt(s.length()-1);
				}
				if(count==1){
					re+=s.charAt(s.length()-1);
				}
				System.out.println(re);
				break;
			}
		}
	}
}

算法训练 P1102  
时间限制:1.0s   内存限制:256.0MB
  定义一个学生结构体类型student,包括4个字段,姓名、性别、年龄和成绩。然后在主函数中定义一个结构体数组(长度不超过1000),并输入每个元素的值,程序使用冒泡排序法将学生按照成绩从小到大的顺序排序,然后输出排序的结果。
  输入格式:第一行是一个整数N(N<1000),表示元素个数;接下来N行每行描述一个元素,姓名、性别都是长度不超过20的字符串,年龄和成绩都是整型。
  输出格式:按成绩从小到大输出所有元素,若多个学生成绩相同则成绩相同的同学之间保留原来的输入顺序。
输入:
  3
  Alice female 18 98
  Bob male 19 90
  Miller male 17 92

输出:
  Bob male 19 90
  Miller male 17 92
  Alice female 18 98
这个题还是蛮有意思的用两个数组,一个一维数组一个二维数组,一维数组管要输出的内容,二维数组装分数和下标。

代码:

import java.util.Scanner;

public class P1102 {

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=Integer.parseInt(sc.nextLine());
			String[] data=new String[n];
			int[][] arr=new int[n][2];
			String s;
			for (int i = 0; i < data.length; i++) {
				s=sc.nextLine();
				String[] ch=s.split(" ");
				data[i]=s;
				arr[i][0]=i;
				arr[i][1]=Integer.parseInt(ch[3]);
			}
			
			for (int i = 0; i < arr.length; i++) {
				for (int j = 0; j < arr.length; j++) {
					if(arr[i][1]<arr[j][1]){
						int t1=arr[i][1];
						arr[i][1]=arr[j][1];
						arr[j][1]=t1;
						
						int t2=arr[i][0];
						arr[i][0]=arr[j][0];
						arr[j][0]=t2;
					}
				}
			}
			for (int i = 0; i < arr.length; i++) {
				for (int j = 0; j < arr.length; j++) {
					if(arr[i][1]==arr[j][1]){
						if(arr[i][0]<arr[j][0]){
							int k=arr[i][0];
							arr[i][0]=arr[j][0];
							arr[j][0]=k;
						}
					}
				}
			}
			for (int i = 0; i < arr.length; i++) {
				System.out.println(data[arr[i][0]]);
			}
		}
	}
}

算法训练 P1101  
时间限制:1.0s   内存限制:256.0MB
  
  有一份提货单,其数据项目有:商品名(MC)、单价(DJ)、数量(SL)。定义一个结构体prut,其成员是上面的三项数据。在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输出提货单的总金额。
  输入格式:第一行是数据项个数N(N<100),接下来每一行是一个数据项。商品名是长度不超过100的字符串,单价为double类型,数量为整型。
  输出格式:double类型的总金额。
输入:
  4
  book 12.5 3
  pen 2.5 10
  computer 3200 1
  flower 47 5

输出:
  3497.500000
这个题蛮简单的,注意保留六位数小数就行了。

代码:

import java.util.Scanner;
import java.math.BigDecimal;

public class P1101 {

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		
		while(sc.hasNext()){
			int n=Integer.parseInt(sc.nextLine());
			double sum=0;
			String s;
			for (int i = 0; i < n; i++) {
				s=sc.nextLine();
				String[] strarr=s.split(" ");
				double x=Double.parseDouble(strarr[1])*Double.parseDouble(strarr[2]);
				sum+=x;
			}
			BigDecimal bd=BigDecimal.valueOf(sum);
			String str=bd.setScale(6, BigDecimal.ROUND_HALF_UP).toString();
			System.out.println(str);
		}
	}
}
ps:这几天做的题都比较简单,明天开始做历届试题吧。一天搞懂两题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值