牛客網--字節跳動面試題--特征提取
博客說明
文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗匯總,如有什么地方侵權,請聯系本人刪除,謝謝!
來源
鏈接:特征提取 來源:牛客網
題目
小明是一名算法工程師,同時也是一名鏟屎官。某天,他突發奇想,想從貓咪的視頻里挖掘一些貓咪的運動信息。為了提取運動信息,他需要從視頻的每一幀提取“貓咪特征”。一個貓咪特征是一個兩維的vector<x, y>。如果x_1=x_2 and y_1=y_2,那么這倆是同一個特征。
因此,如果喵咪特征連續一致,可以認為喵咪在運動。也就是說,如果特征<a, b>在持續幀里出現,那么它將構成特征運動。比如,特征<a, b>在第2/3/4/7/8幀出現,那么該特征將形成兩個特征運動2-3-4 和7-8。
現在,給定每一幀的特征,特征的數量可能不一樣。小明期望能找到最長的特征運動。
輸入描述:
第一行包含一個正整數N,代表測試用例的個數。
每個測試用例的第一行包含一個正整數M,代表視頻的幀數。
接下來的M行,每行代表一幀。其中,第一個數字是該幀的特征個數,接下來的數字是在特征的取值;比如樣例輸入第三行里,2代表該幀有兩個貓咪特征,<1,1>和<2,2>
所有用例的輸入特征總數和<100000
N滿足1≤N≤100000,M滿足1≤M≤10000,一幀的特征個數滿足 ≤ 10000。
特征取值均為非負整數。
輸出描述:
對每一個測試用例,輸出特征運動的長度作為一行
輸入例子1:
1
8
2 1 1 2 2
2 1 1 1 4
2 1 1 2 2
2 2 2 1 4
0
0
1 1 1
1 1 1
輸出例子1:
3
例子說明1:
特征<1,1>在連續的幀中連續出現3次,相比其他特征連續出現的次數大,所以輸出3
思路
1、使用map,將遍歷的得到的第一個坐標作為key存入map集合,在輔助map里面記錄次坐標的次數
2、遍歷所有的幀,比較最大的次數
代碼
import java.util.HashMap;
import java.util.Scanner;
/**
* @author guizimo
* @date 2020/7/18 2:25 下午
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 0; i < n; i++) {
HashMap<String, Integer> map = new HashMap<>();
HashMap<String, Integer> temp = new HashMap<>();
int m = scanner.nextInt();
int max = 1;
//遍歷幀
for (int j = 0; j < m; j++) {
//清空輔助map
temp.clear();
int number = scanner.nextInt();
//遍歷幀內的坐標
for (int k = 0; k < number; k++) {
int x = scanner.nextInt();
int y = scanner.nextInt();
//拼接key
String key = String.valueOf(x) + " " + String.valueOf(y);
temp.put(key,map.getOrDefault(key,0)+1);
max = Math.max(temp.get(key),max);
}
map.clear();
map.putAll(temp);
}
if (max <= 1) {
System.out.println(1);
}else {
System.out.println(max);
}
}
}
}
感謝
牛客網
字節跳動
以及勤勞的自己
關注公眾號: 歸子莫,獲取更多的資料,還有更長的學習計划