码迷,mamicode.com
首页 > 其他好文 > 详细

特征提取-头条2019笔试题

时间:2020-05-26 13:53:30      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:笔试   arrays   util   class   输出   笔试题   一个   mes   就是   

特征提取-头条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笔试题

标签:笔试   arrays   util   class   输出   笔试题   一个   mes   就是   

原文地址:https://www.cnblogs.com/lixyuan/p/12965050.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!