算法面试题

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));
			}
		}
	}
}


你可能感兴趣的:(算法面试题)