1.给定一个字符串,按单词将该字符串逆序,比如给定"This is a sentence",则输出是"sentence a is This",为了简化问题,字符串中不包含标点符号。
分两步
1 先按单词逆序得到"sihT si a ecnetnes"
2 再整个句子逆序得到"sentence a is This"
public class test { public static void main(String[] args) { // Scanner in = new Scanner(System.in); // String str = new String(); // while(in.hasNext()){ // // str= in.nextLine(); String str = "hello world girl abcd"; char[] chs = str.toCharArray(); reverseWords(chs, 0, str.length()-1); int left = 0,right; for(int i = 0; i<str.length();i++){ if(chs[i] == ' '){ right = i-1; reverseWords(chs, left , right); left = i+1; }else{ right = i; } if(right == str.length()-1){ reverseWords(chs, left , right); } } for(char s:chs){ System.out.print(s); } // } } public static void reverseWords(char[] str, int i, int j){ while(i<j){ char temp = str[i]; str[i] = str[j]; str[j] = temp; i++; j--; } }
2.求最长子序列长度
5,3,4,8,6,7
根据上面找到的状态,我们可以得到:(下文的最长非降子序列都用LIS表示)
前1个数的LIS长度d(1)=1(序列:5)
前2个数的LIS长度d(2)=1(序列:3;3前面没有比3小的)
前3个数的LIS长度d(3)=2(序列:3,4;4前面有个比它小的3,所以d(3)=d(2)+1)
前4个数的LIS长度d(4)=3(序列:3,4,8;8前面比它小的有3个数,所以 d(4)=max{d(1),d(2),d(3)}+1=3)
public class MaxChild { public static void main(String[] args) { char[] chs = {5,2,4,8,6,7}; int[] d = new int[6]; for(int i = 0; i<6; i++){ d[i] = 1; for(int j=0;j<i;j++){ if(chs[j]<=chs[i] && d[j]+1>d[i]){ d[i] = d[j]+1; } } } int max = d[0]; for(int i = 0; i<6; i++){ // System.out.println(d[i]); if(d[i]>max){ max = d[i]; } } System.out.println(max); } }
3.输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
Input
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
Output
对于每组输入数据,输出一行,结果保留两位小数。
Sample Input
0 0 0 1 0 1 1 0
Sample Output
1.00 1.41
import java.math.BigDecimal; import java.util.*; public class 两点距离 { public static void main(String[] args) { Scanner cin = new Scanner(System.in); double x1,y1,x2,y2; while(cin.hasNextDouble()){ x1 = cin.nextDouble(); y1 = cin.nextDouble(); x2 = cin.nextDouble(); y2 = cin.nextDouble(); double result = Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2)); System.out.println(new BigDecimal(result).setScale(2,BigDecimal.ROUND_HALF_UP)); } } }
4 输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
Sample Input
100 120 300 380
Sample Output
no 370 371
import java.util.*; class Main{ public static void main(String[] args) { Scanner cin = new Scanner(System.in); int m,n,a,b,c; while(cin.hasNextInt()){ m = cin.nextInt(); n = cin.nextInt(); if(m<100 || m>999){ continue; } if(n<100 || n>999){ continue; } String result = ""; boolean flag=false; for(int i=m;i<=n;i++){ a = i%10; b = i/10%10; c = i/100; int s = a*a*a+b*b*b+c*c*c; if(i==s){ if("".equals(result)){ result = result+i; }else{ result = result+" "+i; } flag = true; } } if(flag){ System.out.println(result); }else{ System.out.println("no"); } } } }
5.第几天问题?
import java.util.*; class Main{ public static void main(String[] args) { //每年的第几天 Scanner cin = new Scanner(System.in); while(cin.hasNext()){ String m = cin.next(); if(m==null || m.equals("")){ continue; } int[] num = new int[3]; String[] str=m.split("/"); int[] months = {0,31,28,31,30,31,30,31,31,30,31,30,31}; if((Integer.parseInt(str[0])%4==0 && Integer.parseInt(str[0])%100 !=0)|| (Integer.parseInt(str[0])%400 ==0)){ months[1] = 29; } int day=0; for(int i=0;i<Integer.parseInt(str[1]);i++){ day = day+months[i]; } System.out.println(day+Integer.parseInt(str[2])); } } }
6 输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。
Output
对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。
Sample Input
6 0 1 2 3 -1 0 5 1 2 3 4 0.5 0
Sample Output
1 2 3 0 0 5
import java.util.*; class Main{ public static void main(String[] args) { Scanner cin = new Scanner(System.in); double[] num = new double[100]; while(cin.hasNext()){ int a=0,b=0,c=0; int n = cin.nextInt(); if(n==0){ continue; }else{ for(int i=0;i<n;i++){ num[i] = cin.nextDouble(); } } for(int i=0; i<n;i++){ if(num[i]<0){ a++; }else if(num[i]>0){ c++; }else{ b++; } } System.out.println(a+" "+b+" "+c); } } }
7.输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
Output
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
Sample Input
81 4 2 2
Sample Output
94.73 3.41
import java.math.BigDecimal; import java.util.*; class Main{ public static void main(String[] args) { Scanner cin = new Scanner(System.in); while(cin.hasNext()){ int n = cin.nextInt(); int m = cin.nextInt(); if(n>=10000 || m>1000){ continue; } if(n<0 || m<0){ continue; } double a = n; double temp = Math.sqrt(n); for(int i =1;i<m;i++){ a = a + temp; temp = Math.sqrt(temp); } System.out.println(new BigDecimal(a).setScale(2,BigDecimal.ROUND_HALF_UP)); } } }
8.输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。
Output
对于每个测试实例n,要求输出多项式前n项的和。每个测试实例的输出占一行,结果保留2位小数。
Sample Input
2 1 2
Sample Output
1.00 0.50
import java.math.BigDecimal; import java.util.*; class Main{ public static void main(String[] args) { Scanner cin = new Scanner(System.in); while(cin.hasNext()){ int m = cin.nextInt(); if(m>=100){ continue; } int[] num = new int[m]; for(int i=0;i<m;i++){ num[i] = cin.nextInt(); } for(int i = 0;i<m;i++){ double result = 0; for(int j = 1;j<=num[i];j++){ double temp = (double)1/j; if(j%2==0){ result -= temp; }else{ result += temp; } } System.out.println(new BigDecimal(result).setScale(2,BigDecimal.ROUND_HALF_UP)); } } } }