贝壳找房2018算法笔试

第一题

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class Main {
	public static void main(String[] args) {
		Map<Integer, Integer> m = new HashMap<Integer, Integer>();
		System.out.println("请输入第一行:");
		Scanner s = new Scanner(System.in);
		String first = s.nextLine();
		String[] line1 = first.split(" ");
		int n = Integer.parseInt(line1[0]);// 时间段数
		int p1 = Integer.parseInt(line1[1]);
		int p2 = Integer.parseInt(line1[2]);
		int p3 = Integer.parseInt(line1[3]);
		int t1 = Integer.parseInt(line1[4]);
		int t2 = Integer.parseInt(line1[5]);
		System.out.println("请输入时间段:");
		String str1;
		int[] arr = new int[2 * n];
		for (int i = 0; i < n; i++) {
			Scanner s1 = new Scanner(System.in);
			str1 = s1.nextLine();
			if (!str1.equals("")) {
				String[] str = str1.split(" ");
				int from = Integer.parseInt(str[0]);
				int to = Integer.parseInt(str[1]);
				m.put(from, to);
				arr[2 * i] = from;
				arr[2 * i + 1] = to;
			}
        //s1.close()  这个地方不能调用s1.close()方法,这个方法在关闭流的同时还会关闭system.in
		}
		s.close();
		int count = computer(m, p1, p2, p3, t1, t2);
		System.out.println("常规时间耗电量:" + count);// 这个是对的
		for (int i = 1,j=1; i < arr.length - 1; i=i+2,j++) {
			int cha = arr[i + 1] - arr[i];
			System.out.println("第" + j + "阶段时间差为:" + cha);
			if (cha <= t1) {
				count += (cha * p1);
				System.out.println("*第" + j + "个时段:" + count);
			} else if (t1 < cha && cha <= t1 + t2) {
				count += (t1 * p1 + (cha - t1) * p2);
				System.out.println("**第" + j + "个时段:" + count);
			} else if (cha > t1 + t2) {
				count += (t1 * p1 + t2 * p2 + (cha - t1 - t2) * p3);
				System.out.println("***第" + j + "个时段:" + count);
			}
		}
		System.out.println("总耗电量:" + count);
	}

	public static int computer(Map<Integer, Integer> m, int p1, int p2, int p3, int t1, int t2) {
		int sum = 0;
		Set<Entry<Integer, Integer>> s = m.entrySet();
		Iterator<Entry<Integer, Integer>> it = s.iterator();
		while (it.hasNext()) {// 正常工作总耗电
			Entry<Integer, Integer> en = it.next();
			sum += ((Integer) en.getValue() - (Integer) en.getKey()) * p1;
		}
		return sum;
	}
}

测试结果

有时不是不会做,而是时间不够用啊!还是怪自己不够熟练吧。。。

这道题挺简单的,就像是高中时候学的分段函数一样,不同的情况采用不同的计算方式。遇到一个知识点,就是当有多个scanner实例时,应该在执行完全部输入后再调用close()方法关闭流。因为close()方法还会关闭System.in,这样后面如果再调用scanner的话,就会报错:java.util.NoSuchElementException: No line found

第二题

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s1 = new Scanner(System.in);
		int num = s1.nextInt();
		Scanner s2 = new Scanner(System.in);
		String[] str = s2.nextLine().split(" ");
		s1.close();
		s2.close();
		int len = str.length;
		if(len == num){
			int [] value = new int[len];
			for(int i=0;i<len;i++){
				value[i] = Integer.parseInt(str[i]);
			}	
			System.out.println(computer(value));
		}else{
			System.out.println("输入数据有误!");
		}
		
	}
	public static int computer(int[] str){
		int count = 0;
		int len = str.length;
		int min,max;
		for(int i=0;i<len-1;i++){
			if(str[i]>=str[i+1]){
				max = str[i];
				min = str[i+1];
			}else{
				min = str[i];
				max = str[i+1];
			}
			for(int j=i+1;j<len;j++){
				if(str[j]>=max){
					max = str[j];
					count+=(max - min);
				}else if(str[j]<=min){
					min = str[j];
					count+=(max - min);
				}else{
					count+=(max - min);
				}
			}
		}
		return count;
	}
}

测试结果

这题也比较简单,用了两个循环。外层循环确定起始点以及最大最小值,内层循环用来遍历起点之后的元素,并判断最大最小值。

第三题

这题看了一眼,没思路。。。哪位大神会的还请指教一下!小弟感激不尽!

猜你喜欢

转载自blog.csdn.net/ASN_forever/article/details/81814442