zoukankan      html  css  js  c++  java
  • NET 在一个数组中查找另一个数组所在起始位置(下标从0开始,未找到返回-1)

    问题:

    如果 search 在 dist 中顺序出现而不要求连续出现,那代码应该如何修改?如何计算这种匹配的可能性?

    数组 search=[5,4,6],在数据 dist=[1,5,5,4,3,4,5,6]的起始位置是1

    (因为dist下标{1,3,7}和下标{1,5,7}的元素都等于 search=[5,4,6],故有两种可能)

            /// <summary>
            /// 如果 search 在 dist 中顺序出现而不要求连续出现,那代码应该如何修改?如何计算这种匹配的可能性?
            /// 例如:
            /// 数组 search=[5,4,6],在数据 dist=[1,5,5,4,3,4,5,6]的起始位置是1
            /// (因为dist下标{1,3,7}和下标{1,5,7}的元素都等于 search=[5,4,6],故有两种可能)
            /// </summary>
            private static void indexOf()
            {
                var search = new int[] { 5, 4, 6 };
                Console.WriteLine($"连续出现的数组:{string.Join("-", search)}");
                var dist = new int[] { 1, 5, 5, 4, 3, 4, 5, 6 };
                Console.WriteLine($"需要比对的数组:{string.Join("-", dist)}");
                var dictionary = new Dictionary<object, List<int>>();
                //  按照数组顺序初始化字典
                foreach (var item in search)
                {
                    dictionary.Add(item, new List<int>());
                }
                //  把search中元素的下标记录下来
                for (int i = 0; i < dist.Length; i++)
                {
                    var key = dist[i];
                    if (Array.IndexOf(search, key) > -1)
                    {
                        if (dictionary.ContainsKey(key))
                        {
                            dictionary[key].Add(i);
                        }
                    }
                }
                var group = new List<List<int>>();
                Console.WriteLine("分组前:");
                foreach (var key in dictionary.Keys)
                {
                    Console.WriteLine($"Key:{key}	下标集合:{string.Join("-", dictionary[key])}");
                }
                Add(new List<int>(), -1, 0, search, dictionary, group);
                Console.WriteLine("分组后:");
                foreach (var item in group)
                {
                    Console.WriteLine($"下标集合:{string.Join("-", item)}");
                }
            }
    
            /// <summary>
            /// 递归添加
            /// </summary>
            /// <param name="list">需要添加的集合</param>
            /// <param name="parentKey">上一次的key,当前循环key要比上一次大</param>
            /// <param name="index">下标</param>
            /// <param name="search"></param>
            /// <param name="dictionary"></param>
            /// <returns></returns>
            private static void Add(List<int> list, int parentKey, int index, int[] search, Dictionary<object, List<int>> dictionary, List<List<int>> group)
            {
                if (search.Count() <= index)
                {
                    //  匹配项超过数组长度,终止
                    group.Add(list);
                    return;
                }
    
                //  当前下标的值
                var key = search[index];
                if (dictionary.ContainsKey(key))
                {
                    var itemList = dictionary[key];
                    //  循环值
                    for (int j = 0; j < itemList.Count(); j++)
                    {
                        var itemKey = itemList[j];
                        //  当前循环key要比上一次大
                        if (itemKey < parentKey)
                        {
                            return;
                        }
                        var clone = Clone(list);
                        clone.Add(itemKey);
                        Add(clone, itemKey, index + 1, search, dictionary, group);
                    }
                }
            }
    
            /// <summary>
            /// 克隆
            /// </summary>
            /// <param name="list"></param>
            /// <returns></returns>
            private static List<int> Clone(List<int> list)
            {
                var clone = new List<int>();
                foreach (var item in list)
                {
                    clone.Add(item);
                }
                return clone;
            }
  • 相关阅读:
    python目录操作shutil
    python os.walk
    利用华为eNSP模拟器实现vlan之间的通信
    Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
    利用Excel做一些简单的数据分析
    Django中的枚举类型
    django使用model创建数据库表使用的字段
    ps 命令的十个简单用法
    goinception安装
    docker安装redis 指定配置文件且设置了密码
  • 原文地址:https://www.cnblogs.com/Cailf/p/11714780.html
Copyright © 2011-2022 走看看