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);
}
}
其实还有别的写法,暂时没时间了,先这样