2018链家春招后端开发实习题解

第一题:
/*
 * 有n个开关,每个开关可控制若干个灯泡,请问最多可控制多少个灯泡
 * 注:每个开关控制的灯泡会有重复,利用Set可自然去重
 */
public class LampControl {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();	//n组开关
		Set<Integer> set = new HashSet<Integer>();	//存储灯泡序号
		int[] k = new int[n];	//存储开关控制的灯泡个数
		for(int i = 0;i < n;i ++) {
			k[i] = s.nextInt();
			for(int j = 0;j < k[i];j ++) {
				set.add(s.nextInt());
			}
		}		
		System.out.println(set.size());
	}
}

第二题:
import java.util.*;
/*
 * n根木棍,第i根木棍长度是i,请问最少去除几根木棍可以使剩下的木棍不能构成一个三角形。
 * 思路:考虑两边之和大于第三边,可以构成三角形的情况,即需要被去除的情况;
 * 或者,因为保留的是小于等于n的斐波那契数列(不能构成三角形的1,2,3,5,8),
 * 可以先求出所有小于等于n的斐波那契数列,然后用n-数列的长度,等于需要去除的木棍个数。
 */
public class StickProblem {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		while(s.hasNext()) {
			int n = s.nextInt();
			int x1 = 2;
			int x2 = 3;
			int result = 0;
			for(int i = 4;i <= n;i ++) {
				if(i < x1 + x2) {	//两边之和大于第三边,可以构成三角形的情况,即去除木棍的情况
					result ++;
					//System.out.println("x1: "+x1+" x2: "+x2);
				}
				else {
					x1 = x2;
					x2 = i;
				}
			}
			System.out.println(result);
//			StickProblem sp = new StickProblem();
//			System.out.println(sp.getCount(n));
			x1 = 2;
			x2 = 3;
			result = 0;
		}		
	}
	
	public int getCount(int n) {	//保留的是小于等于n的斐波那契数列(不能构成三角形的)
		if(n == 1 || n == 2 || n == 3)
			return 0;
		int x1 = 2;
		int x2 = 3;
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		while(x1 + x2 <= n) {
			int x = x1 + x2;
			list.add(x);
			x1 = x2;
			x2 = x;
		}
		//System.out.println(list);
		return n - list.size();
	}
}

猜你喜欢

转载自blog.csdn.net/zhou15755387780/article/details/79858340
今日推荐