问题:

如果 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[] { , , };
Console.WriteLine($"连续出现的数组:{string.Join("-", search)}");
var dist = new int[] { , , , , , , , };
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 = ; i < dist.Length; i++)
{
var key = dist[i];
if (Array.IndexOf(search, key) > -)
{
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}\t下标集合:{string.Join("-", dictionary[key])}");
}
Add(new List<int>(), -, , 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 = ; j < itemList.Count(); j++)
{
var itemKey = itemList[j];
// 当前循环key要比上一次大
if (itemKey < parentKey)
{
return;
}
var clone = Clone(list);
clone.Add(itemKey);
Add(clone, itemKey, index + , 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;
}

NET 在一个数组中查找另一个数组所在起始位置(下标从0开始,未找到返回-1)的更多相关文章

  1. js 从目标数组中过滤掉 一个数组元素,

    标题描述的有点僵硬,大概需求是,从目标数组中过滤掉我想要删除的元素集合,这里使用的是遍历+过滤器的组合,很方便,做个笔记! let old = ["AE_CN_SUPER_ECONOMY_G ...

  2. sqlserver中获取最后一个字符所在的位置

    CHARINDEX('字符',reverse(字段名称)) 这个意思就是将字段进行反转,就是从后往前取,这样就能够获取一个字符最后所在的位置

  3. [LeetCode] 34. Find First and Last Position of Element in Sorted Array 在有序数组中查找元素的第一个和最后一个位置

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  4. 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

  5. 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...

  6. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  7. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  8. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  9. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

随机推荐

  1. Spring Cloud Eureka详细说明

    之前学习了如何配置Eureka注册中心.消费者等,关于更详细的一些常用的配置在这里说明. 1.注册中心的自我保护模式 在我们调试Eureka的注册中心时,访问注册中心页面,常常会看见以下提示. 该提示 ...

  2. 11.Redis 哨兵集群实现高可用

    作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis mast ...

  3. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  4. odoo10学习笔记十七:controller

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189391.html 一:controller简述 odoo里面的controller相似于springM ...

  5. 防止xss攻击的前端的方法

    项目当中在进行安全测试的时候,遇到了xss的攻击,要求前端来做个防御,针对于遇到的xss攻击,做个总结 1.xss---存储型xss的攻击 前端只要在接收到后台数据的时候做个特殊字符的过滤,即可抵制攻 ...

  6. 201871020225-牟星源《面向对象程序设计(java)》第十周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...

  7. Maven 生命周期的阶段与插件的目标之间的绑定关系

    clean 生命周期 clean 生命周期的阶段 插件的目标 pre-clean clean maven-clean-plugin:clean post-clean default 生命周期的内置插件 ...

  8. java中利用POI读写excel2007需要导入的jar

    1.下载POI模块:http://poi.apache.org/download.html 2.解压并导入以下包: 导入不会时会报错.

  9. day7_7.5 字符表与文件操作

    一.字符编码. 1. 在计算机的运行中,有三大部分组成,计算机硬件,操作系统,应用程序,当使用者在使用文档编写文字时,所显示的所有字符都存储在内存中,随后再存储在硬盘里,(仅限文字),所以,当美国人发 ...

  10. 莫烦TensorFlow_10 过拟合

    import tensorflow as tf from sklearn.datasets import load_digits from sklearn.cross_validation impor ...