2018年8月12日 今日头条笔试 整理

1. 一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。
球迷选座特性:1.
1.同球迷群体会选择相邻座位,不同球迷群体选择不相邻的座位。(相邻包括前后相邻、左右相邻、斜对角相邻);
2.给定一个M*N的二位球场,0代表该位置没人,1代表该位置有人,希望输出球队群体个数P,最大的球队群体人数Q。
输入:
第一行,2个数字,M  N,使用英文逗号隔开
接下来M行,每行N个数字,使用英文逗号隔开
输出:
一行 ,2数字,P   Q
import java.util.Scanner;

public class no1 {
	static boolean[][] flag;
	static int[][] input;
	static int Q = 0;
	static int P = 0;
	static int num = 0;
	static int m;
	static int n;
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String[] s = in.nextLine().split(",");
		m = Integer.parseInt(s[0]);
		n = Integer.parseInt(s[1]);
		input = new int[m][n];
		flag = new boolean[m][n];
		for(int i = 0; i < m; i++){
			String[] inputtemp = in.nextLine().split(",");
			for(int j = 0; j < n; j++){
				input[i][j] = Integer.parseInt(inputtemp[j]);
			}
		}
		in.close();
		
		for(int i = 0; i < m; i++){
			for(int j = 0; j < n; j++){
				P += find(i, j);
			}
		}
		System.out.println(P +","+ Q);
		
		
	}
	public static int find(int i,int j){
		if(input[i][j] == 1 && !flag[i][j]){
			flag[i][j] = true;
			num ++;
			
			if(i != m - 1 && input[i+1][j] == 1 && !flag[i+1][j]){
				find(i+1, j);
			}
			if(i != 0 && input[i-1][j] == 1 && !flag[i-1][j]){
				find(i-1, j);
			}
			
			if(j != n-1 && input[i][j+1] == 1 && !flag[i][j+1]){
				find(i, j+1);
			}
			if(j != 0 && input[i][j-1] == 1 && !flag[i][j-1]){
				find(i, j-1);
			}
			
			if(i != 0 && j != 0 && input[i-1][j-1] == 1 && !flag[i-1][j-1]){
				find(i-1, j-1);
			}
			if(i != 0 && j != n-1 && input[i-1][j+1] == 1 && !flag[i-1][j+1]){
				find(i-1, j+1);
			}
			if(i != m-1 && j != n-1 && input[i+1][j+1] == 1 && !flag[i+1][j+1]){
				find(i+1, j+1);
			}
			if(i != m-1 && j != 0 && input[i+1][j-1] == 1 && !flag[i+1][j-1]){
				find(i+1, j-1);
			};
		}else{
				if(Q < num)
					Q = num;
				num = 0;
				flag[i][j] = true;
				return 0;
			}
		return 1;
			
			
			
		}
	}
	
	


2. 文章病句标识
题目描述:
    为了提高文章质量,每一篇文章(假设全部都是英文)都会有m名编辑审核,每个编辑独立工作,会把觉得有问题的句子通过下标记录下来,比如[1,10],1表示病句的第一个字符,10表示病句的最后一个字符。也就是从1到10个字符组成的句子,是有问题的。
    现在需要把多名编辑有问题的句子合并起来,送给总编辑进行最终的审核。比如编辑a指出的病句是[1,10],[32,45];b编辑指出的病句是[5,16],[78,94],那么[1,10]和[5,16]是有交叉的,可以合并成[1,16],[32,45],78,94]
输入描述:
    编辑数量m,之后每行是每个编辑的标记的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔
输出描述:
    合并后的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔。返回结果是从小到大的递增排列。
输入:
3
1,10;32,45
78,94;5,16
80,100;200,220;16,32
输出:
1,45;78,100;200,220
/*
 *  自己写一个数据结构,然后对这个数据结构排序.
 */

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class no2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int m = Integer.parseInt(in.nextLine());
		ArrayList<Interval> input = new ArrayList<>();
		
		for(int i = 0; i < m; i++){
			String[] errorsClassifiedByEditors = in.nextLine().split(";");
			for(int j = 0; j < errorsClassifiedByEditors.length; j++){
				String[] errors = errorsClassifiedByEditors[j].split(",");
				input.add(new Interval(Integer.parseInt(errors[0]), Integer.parseInt(errors[1])));
			}
		}
		in.close();
		
		Collections.sort(input,new Comparator<Interval>(){
			@Override
			public int compare(Interval o1, Interval o2) {
				return o1.start - o2.start;
			}	
		});
		
		Interval prev = null;
		ArrayList<Interval> results = new ArrayList<>();
		for(Interval item : input){
			if(prev == null || item.start > prev.end){
				results.add(item);
				prev = item;
			}else if(prev.end < item.end){
				prev.end = item.end;
			}
		}
	 
		int count = 0;
		for(Interval item : results){
			if(count == results.size() - 1){
				System.out.print(item.start + "," + item.end);
			}else{
				System.out.print(item.start + "," + item.end + ";");
			}
			count ++;
		}
		
		
	}

}

class Interval{
	int start;
	int end;
	
	public Interval(int start, int end){
		this.start = start;
		this.end = end;
	}
}


3. 小a和小b玩一个游戏,有n张卡牌,每张上面有两个正整数x,y。
取一张牌时,个人积分增加x,团队积分增加y。
求小a,小b各取若干张牌,使得他们的个人积分相等。
输入描述:
第一行n
接下来n行,每行两个整数x,y
输出描述:
一行一个整数
表示小a的积分和小b的积分相等的时候,团队积分的最大值。
输入:
4
3 1
2 2
1 4
1 4
输出
10
数据范围:
0 < n < 100
0 < x < 1000
0 < y < 1e6

\\动态规划
import java.util.Scanner;

public class test3 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        int[] key = new int[num];
        int[] value = new int[num];
        int max = 0;
        for (int i = 0; i < num; i++) {
            int inputKey = scan.nextInt();
            int inputValue = scan.nextInt();
            key[i] = inputKey;
            value[i] = inputValue;
            max = max>inputKey?max:inputKey;
        }
        int[][] result = dp(num, max, key, value);
        System.out.print(result[num][0]);
    }

    public static int[][] dp(int num, int max, int[] key, int[] value){
        int[][] result = new int[num+1][max+1];
        for (int j = 0; j <= max; j++) result[0][j] = 0;
        for (int i = 1; i <= num; i++){
            for (int j = 0; j <= max; j++){
                int temp1=0, temp2=0;
                if (j-key[i-1]>=0) temp1 = result[i-1][j-key[i-1]] + value[i-1];
                if (j+key[i-1]<=max) temp2 = result[i-1][j+key[i-1]] + value[i-1];
                result[i][j] = Math.max(Math.max(result[i-1][j], temp1),temp2);
                if (i == 1 && j == 0) result[i][j] = 0;
            }
        }
        return result;
    }
}


参考大神的代码:https://www.jianshu.com/p/83204e62ac94
4.两个长度为n的序列a,b
问有多少个区间[l,r]满足
max(a[l,r]) < min(b[l,r])
即a区间的最大值小于b区间的最小值
数据范围:
n < 1e5
ai,bi < 1e9
输入描述:
第一行一个整数n
第二行n个数,第i个为ai
第三行n个数,第i个为bi
0 <= l <= r < n
输出描述:
一行一个整数,表示答案
输入:
3
3 2 1
3 3 3
输出:
3

import java.util.Scanner;

public class test4 {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        int[] arr1 = new int[num];
        int[] arr2 = new int[num];
        for (int i = 0; i < num; i++){
            arr1[i] = scan.nextInt();
        }
        for (int i = 0; i < num; i++){
            arr2[i] = scan.nextInt();
        }
        System.out.println(resolve(arr1, arr2, 0, 0, 0, 0));
    }

    public static int resolve(int[] arr1, int[] arr2, int start, int end, int maxIndex, int minIndex) {
        if (start > end || end >= arr1.length) return 0;
        int max = arr1[maxIndex]>arr1[end]?maxIndex:end;
        int min = arr2[minIndex]<arr2[end]?minIndex:end;
        if (arr1[max] >= arr2[min]) return resolve(arr1,arr2,start+1,start+1, start+1, start+1);
        return 1+((end==arr1.length-1)?resolve(arr1,arr2,start+1,start+1, start+1, start+1):resolve(arr1,arr2,start,end+1,max,min));
    }
}


参考大神的代码:https://www.jianshu.com/p/83204e62ac94
5. 小明在抖音关注了n个主播,每个主播每天的开播时间是固定的,分别在时刻开始,ti时刻结束。小明无法同时看两个直播。一天被分为m个时间单位。请问小明每天最多能完整观看多少个直播?
输入描述:
第一行一个整数,代表n
第二行一个整数,代表m
第三行空格分隔n*2个整数,代表s,t
输出描述:
一行一个整数,表示答案
输入:
3 
10
0 3 3 7 7 0
输出
3
数据范围:
1 <= n <= 10^5
2 <= m <= 10^6
0 <= si,ti < m


import java.util.*;

public class test5 {

    // 自定义区间类
    public static class Interval{
        public int begin;
        public int end;
        public Interval(int begin, int end){
            this.begin = begin;
            this.end = end;
        }
        public String toString(){
            return String.format(begin+"-"+end);
        }
    }

    public static class MyComparator implements Comparator<Object> {
        public int compare(Object o1,Object o2){
            Interval s1 = (Interval) o1;
            Interval s2 = (Interval) o2;
            return s1.begin - s2.begin;
        }
    }

    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        int over = scan.nextInt();
        List<Interval> list = new ArrayList<>();
        for (int i = 0; i < num; i++){
            int start = scan.nextInt();
            int end = scan.nextInt();
            list.add(new Interval(start,end));
        }
        Collections.sort(list,new MyComparator());
        List<Interval>[] arr = (ArrayList<Interval>[])new ArrayList[num];
        for (int i = 0; i < num; i++){
            arr[i] = new ArrayList<>();
        }
        for (Interval item : list){
            for (int j = 0; j < num; j++){
                if (arr[0].isEmpty()){
                    arr[0].add(item);
                    break;
                }
                if (arr[j].isEmpty()){
                    break;
                }
                else if (arr[j].get(arr[j].size()-1).end > item.begin){
                    continue;
                }
                else {
                    arr[j].add(item);
                    continue;
                }
            }
        }
        int max = 0;
        for (List<Interval> item : arr){
            max = max>item.size()?max:item.size();
        }
        System.out.println(max);
    }
}

参考大神的代码:https://www.jianshu.com/p/83204e62ac94

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值