2018年8月12日 今日頭條筆試 整理
阿新 • • 發佈:2019-02-19
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