java学习笔记<二>——OJ习题练习(15-21)

2020.8.26

15、我爱工作

Description:工作日使人快乐!休息日让人沮丧!当告诉你今天是周几,你需要表现出对应的心情。周一至周五是happy,周六至周七是sad。
Input:有多组样例。
对于每组样例,在一行中输入一个n,代表今天是周几。
当n=0时输入结束。
Output:对于每一个n,在一行中输出一个字符串 “happy!” or “sad!”。
Sample Input 1 :
1
7
0
Sample Output 1:
happy!
sad!


import java.util.Scanner;
public class maxmin {
    public static void main(String args[]) {
    	Scanner sc=new Scanner(System.in);
    	while(sc.hasNext()) {
    		int m=sc.nextInt();
    		if(m==0) {
    			break;
    		}else {
    			if(m>=1 && m<=5) {
    				System.out.println("happy!");
    			}
    			else {
    				System.out.println("sad!");
    			}
    			
    		}  	
        	
    	}

    }
}

在这里插入图片描述
我写的代码不够优秀,优秀代码如下:

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()){
            int a = in.nextInt();
            if(a>=1&&a<=5) System.out.println("happy!");
            else if(a==6||a==7) System.out.println("sad!");
            else if(a==0) break;
        }

    }
}
16、DNA排序

Description:逆序数可以用来描述一个序列混乱程度的量,例如,"DAABEC"的逆序数为5,其中D大于它右边的4个数,E大于它右边的1个数,4+1=5;又如,"ZWQM"的逆序数为3+2+1+0=6。
现在有许多长度一样的字符串,每个字符串里面只会出现四种字母(A,T,G,C)。请编写程序,将这些字符串按照它们的逆序数进行排序。
Input:输入由多组测试数据组成。每组测试数据的第一行为两个数n和m,0<n<=50,0<m<=100。n表示每个序列的长度(同一组测试数据中各序列的长度都为n),m表示此组测试数据中的序列个数。接下来有m行,每行为一个长度为n的DNA字母序列。
Output:对于每组测试数据,输出排序后的序列列表。在排序时,逆序数小的序列排在前面。如果两个序列的逆序数相等,那么它们在列表中出现的顺序和它们在输入中的顺序相同。
在每组测试数据后输出一行“********************”(二十个星号)。
Sample Input 1 :
3 3
ACG
CGT
AGT
6 2
TAAAAA
ATAAAA

Sample Output 1:
ACG
CGT
AGT


ATAAAA
TAAAAA



import java.util.*;
public class dna {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()) {
			int n=sc.nextInt();//DNA长度为n
			int m=sc.nextInt();//DNA个数为m
			String[] str=new String[m];//放所有的DNA
			int[] xa=new int[m];//逆序数
			int[] xb=new int[n];//字符转为数字
			for(int i=0;i<m;i++) {
				str[i]=sc.next();				
			}
			for(int i=0;i<m;i++) {
				for(int j=0;j<n;j++) {
					if(str[i].charAt(j)=='A') {
						xb[j]=1;					
					}else if(str[i].charAt(j)=='C') {
						xb[j]=2;
					}else if(str[i].charAt(j)=='G') {
						xb[j]=3;
					}else if(str[i].charAt(j)=='T') {
						xb[j]=4;
					}
				}
				xa[i]=invertse(xb,n);//小心一点,不要放到循环里面
			}
			for(int i=0;i<m;i++) {//重点看,出错了
				int min=0;
				for(int k=0;k<m;k++) {//每一次都要和其他的比较
					if(xa[k]<xa[min]) {//找出逆序数最小的,输出
						min=k;
					}
				}
				System.out.println(str[min]);
				xa[min]=10000;//使得输出的数据最大,不列入少许的循环
				
			}
			System.out.println("********************");
			
		}
		
	}
	static int invertse(int[] arr,int n) {
		int account=0;
		if(n<=1) {
			return 0;
		}
		for(int i=0;i<n;i++) {
			boolean flag=true; 
			for(int j=0;j<n-i-1;j++) {
				if(arr[j]>arr[j+1]) {
				//第一次将最大的数放在最右边,下一步把剩下的数中最大的数放在右侧第二
					int tmp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=tmp;
					account++;//计算字符大的次数
					flag=false;
				}
			}
			if(flag) {
				break;
			}
		}
		return account;
	}

}

在这里插入图片描述
代码理解:
charAt() 方法: 用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
语法:public char charAt(int index)
参数:index – 字符的索引。
返回值:返回指定索引处的字符。

17、电梯

Description:有一部电梯。 请求列表由N个正整数组成。 每个数字按顺序表示他要去的楼层。 将电梯上移一层需要6秒钟,下移一层则需要4秒钟。 电梯停在某个楼层上下客停留5秒钟。
对于给定的请求列表,请你计算完成列表上的请求所花费的总时间。 电梯在开始时位于0楼,并且最后不必返回初始位置。
Input:有多个测试用例。 每个案例包含一个正整数N,接着N个正整数。 输入中的所有数字均小于100。N = 0时测试用例输入结束。 该测试用例不做处理。
Output:将每个测试用例的总时间在一行中输出。
Sample Input 1 :
1 2
3 2 3 1
0
Sample Output 1:
17
41

import java.util.Scanner;

public class dianti {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		while(in.hasNext()) {
			int num=in.nextInt();
			if(num==0) {
				break;
			}
			int[] arr=new int[num+1];
			arr[0]=0;
			for(int i=1;i<=num;i++) {
				arr[i]=in.nextInt();
			}
			int sum=0;
			for(int i=0;i<num;i++) {
				if(arr[i]<arr[i+1]){
					sum=sum+(arr[i+1]-arr[i])*6+5;
				}else if(arr[i]>arr[i+1]) {
					sum=sum+(arr[i]-arr[i+1])*4+5;
				}else {
					sum=sum+5;
				}
			}
		    System.out.println(sum);
		}
			
			
	}

}

在这里插入图片描述

18、字符串替换

Description:输入一串字符串,生成一个新的字符串,将原字符串中的大写字母用下面列出的对应大写字母替换,其余字符不变,输出新字符串。
原字母 对应字母
A-------------->Z
B-------------->Y
C-------------->X
D-------------->W

X-------------->C
Y-------------->B
Z-------------->A

Input:有多个测试用例。 每个测试案例包含一行字符串。当输入字符串为0时,测试结束。

Output:每个测试案例,输出按规则转换后的新字符串。

Sample Input 1 :
A flag of USA
IT12
oueiaba
0

Sample Output 1:
Z flag of FHZ
RG12
oueiaba
代码1:


import java.util.Scanner;
public class changstr {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        while(sc.hasNext()) {
        	String str=sc.nextLine();
        	if(str.equals("0"))//注意:这里是"0",而不是'0'
            	break;
        	String sss="";
        	for(int i=0;i<str.length();i++) {
        		char dd=str.charAt(i);
        		if(dd>=65 && dd<=90)
        			dd=(char)(155-dd);
        		sss=sss+dd;
        	}
        	System.out.println(sss); 
        }
      }
}

在这里插入图片描述
代码理解:
equals 比较字符串类型时,比较其内容是否相同
比较非字符串类型时,比较其地址是否相同。
单引号和双引号区别: 单引号是char类型,双引号是string类型。

代码2:

import java.util.Scanner;

public class changstr1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String s = sc.nextLine();
            if(s.equals("0")){
                break;
            }
            char[] a = s.toCharArray();
            for (int i = 0; i < s.length(); i++) {
                if (a[i] >= 65 && a[i] <= 90) {
                    int b = 90 - ((int) a[i] - 65);
                    a[i] = (char) b;
                }
            }
            for(int i = 0 ; i < a.length ; i++) {
                System.out.print(a[i]);
            }
            System.out.println();
        }
    }
}

toCharArray() 方法 将字符串转换为字符数组。
语法:public char[] toCharArray()

19、求整数的位数以及各位数之和

Description:输入一个正整数repeat(0<repeat<10),做repeat次下列运算:输入一个整数,输出它的位数以及各位数之和。
Input:正整数repeat及repeat个整数
Output:整数的位数以及各位数之和

Sample Input 1 :
4
123456
-100
-1
99

Sample Output 1:
number=6,sum=21
number=3,sum=1
number=1,sum=1
number=2,sum=18


import java.util.Scanner;
public class numsum {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int num=sc.nextInt();
		int[] a=new int[num];
		for(int i=0;i<num;i++) {
			a[i]=sc.nextInt();
			a[i]=Math.abs(a[i]);
		}
		for(int i=0;i<num;i++) {
			String s=String.valueOf(a[i]);
			int number=s.length();
			int sum=0;
			for(int j=0;j<number;j++) {
				String ch=String.valueOf(s.charAt(j));//char转为string
				int ns=Integer.parseInt(ch);//string转为int
				sum=sum+ns;
				
				
			}
			System.out.println("number="+number+",sum="+sum);
			
		}

	}

}

在这里插入图片描述

代码理解:
Integer.parseInt(String) 就是将String字符类型数据转换为Integer整型数据。
String.valueOf由基本数据型态(int,其他)转换成String

20、数字加密

Description:输入1个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,作为该位上的新数字,最后将第1位和第3位上的数字互换,第2位和第4位上的数字互换,组成加密后的新数。
Input:加密前的原四位数
Output:加密后的四位数
Sample Input 1 :1257
Sample Output 1:4601


import java.util.Scanner;
public class encrypte {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc =new Scanner(System.in);
		int input = sc.nextInt();
		int a=input/1000;
		int b=(input%1000)/100;
		int c=(input%100)/10;
		int d=input%10;
		
		int cc=(a+9)%10;
		int dd=(b+9)%10;
		int aa=(c+9)%10;
		int bb=(d+9)%10;

		int output=aa*1000+bb*100+cc*10+dd;
		System.out.print(output);

	}

}

在这里插入图片描述

其实还有别的写法,暂时没时间了,先这样

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值