特征提取-头条2019笔试题

Posted lixyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了特征提取-头条2019笔试题相关的知识,希望对你有一定的参考价值。

特征提取-头条2019笔试题

小明是一名算法工程师, 同时也是一名铲屎官。

某天,他突发奇想,想从猫咪的视频里挖掘一些猫咪的运动信息。

为了提取运动信息,他需要从视频的每一帧提取“猫咪特征”。

一个猫咪特征是一个两维的 vectorc< x, y >。

如果(x_1=x_2)并且(y_1=y_2) ,那么这俩是同一个特征。

因此,如果猫咪特征连续一致,可以认为猫咪在运动。

也就是说,如果特征< a, b >在持续帧里出现,那么它将构成特征运动。

比如,特征< a, b >在第2/3/4/7/8帧出现,那么该特征将形成两个特征运动2-3-4和7-8。

现在,给定每一帧的特征,特征的数量可能不一样。

小明期望能找到最长的特征运动。

输入格式

第一行包含一个正整数M,代表视频的帧数。

接下来的M行,每行代表一帧,其中,第一个数字是该帧的特征个数,接下来的数字是在特征的取值;比如样例输入第三行里,2代表该帧有两个猫咪特征,<1, 1>和<2, 2>。

输出格式

输出特征运动的长度作为一行。

数据范围

1≤M≤10000
输入特征总数和不超过100000。
一帧的特征个数不超过10000。
特征取值均为非负整数。

输入样例:

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

输出样例:

3

样例解释

特征<1,1>在连续的帧中连续出现3次,相比其他特征连续出现的次数大,所以输出3。

解题思路HashMap

  1. 序列化特征<x,y>为x#y, 统计该特征三个信息,连续出现最大次数,当前连续出现次数, 当前出现的轮次。

  2. 遍历HashMap,统计连续出现次数的最大值。

:更新最大次数一定要注意,最好每次更新当前连续出现次数一次,就更新一次最大次数,否则最后需要在遍历一次当前次数,不然会遗漏最后一次。注意、注意、注意

/*
Map<String, int[]> map = new HashMap<>();
"1#1": {max_times, cur_times, last_n}
*/
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        int m = Integer.valueOf(line);
        Map<String, int[]> map = new HashMap<>();
        for(int e=0; e < m; e++){
            String[] str = sc.nextLine().split(" ");
            //System.out.println(Arrays.toString(str));
            int n = Integer.valueOf(str[0]);
            // System.out.println(n);
            for(int i=1; i <= n; i++) {
                String key = str[2*i-1]+"#"+str[2*i];
                if(map.containsKey(key)) {
                    int[] t = map.get(key);
                    //max_times , cur_times, last_n
                    if(t[2]+1 == e) {
                        t[1]++;
                        if(t[1] > t[0]) t[0] = t[1]; // 切勿在else中更新
                    } else {
                        t[1] = 1;
                    }
                    map.put(key, new int[] {t[0], t[1], e});
                } else {
                    map.put(key, new int[] {1, 1, e});
                }
            }
            //System.out.println("###key:" + Arrays.toString(map.get("68#44")));
        }
        int res = 0;
        for(int[] v : map.values()) {
            if(v[0] > res) res = v[0];
        }
        System.out.println(res);
    }
}



以上是关于特征提取-头条2019笔试题的主要内容,如果未能解决你的问题,请参考以下文章

编辑和剪绳子-头条2019笔试题

编辑和剪绳子-头条2019笔试题

奖品分配-头条2019笔试题

奖品分配-头条2019笔试题

变身程序员-头条笔试题2019

变身程序员-头条笔试题2019