zoukankan      html  css  js  c++  java
  • 特征提取-头条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);
        }
    }
    
  • 相关阅读:
    2021上半年下午第二题
    21年软件设计师上半年下午试题一
    软考下午第三题-用例图和类图
    类图
    用例图-包含、扩展、泛化
    软考下午题二------数据库设计
    软件设计师下午题-数据流图
    IP练习题
    2020软件工程作业02
    2020软件工程作业01
  • 原文地址:https://www.cnblogs.com/lixyuan/p/12965050.html
Copyright © 2011-2022 走看看