1. 程式人生 > >2018年8月12日 今日頭條筆試 整理

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