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[] { , , };
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)的更多相关文章
- js 从目标数组中过滤掉 一个数组元素,
标题描述的有点僵硬,大概需求是,从目标数组中过滤掉我想要删除的元素集合,这里使用的是遍历+过滤器的组合,很方便,做个笔记! let old = ["AE_CN_SUPER_ECONOMY_G ...
- sqlserver中获取最后一个字符所在的位置
CHARINDEX('字符',reverse(字段名称)) 这个意思就是将字段进行反转,就是从后往前取,这样就能够获取一个字符最后所在的位置
- [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 ...
- 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...
- 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...
- Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...
- 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
- Leetcode算法【34在排序数组中查找元素】
在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...
随机推荐
- SQL Server学习内容(一)
SQL Server SQL Server对大小写不敏感,每条语句末端使用分号. 1.SQL命令 SELECT 从数据中提取数据 UPDATE 更新数据中的数据 DELETE 从数据库中删除数据 IN ...
- SQL注入:显错注入
SQL注入的本质 就是把用户输入的数据当做代码执行 注入条件 1.用户能控制输入 2.能够将程序原本执行的代码,拼接上用户输入的数据进行执行 例: http://www.xxx.com/new.php ...
- 团队第五次作业——Alpha2版本
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 这个作业要求在哪里 https:// ...
- 每天一套题打卡|河南省第七届ACM/ICPC
A 海岛争霸 题目:Q次询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少. 多源点最短路,用floyd 在松弛更新:g[i][k] < g[i][ ...
- 201871010117-石欣钰《面向对象程序设计(java)》第十一周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...
- 配置nginx 支持php
一.确保php-fpm已经启动: ps -A | grep php-fpm 如果没有启动,则启动php-fpm: /usr/local/sbin/php-fpm 查看是否启动成功: root@iZ25 ...
- Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换
经过前面两篇文章的铺垫,我们这篇介绍,webdriver如何处理,一个浏览器上多个窗口之间切换的问题.我们先脑补这样一个测试场景,你在页面A点击一个连接,会在新的tab窗口打开页面B,这个时候,你在页 ...
- plantUML 安装
plantUML 安装 资源 http://www.graphviz.org/ https://graphviz.gitlab.io/_pages/Download/windows/graphviz- ...
- LeetCode 654. Maximum Binary Tree最大二叉树 (C++)
题目: Given an integer array with no duplicates. A maximum tree building on this array is defined as f ...
- goto命令
GOTO会点编程的朋友就会知道这是跳转的意思. 在批处理中允许以“:XXX”来构建一个标号,然后用GOTO XXX跳转到标号:XXX处,然后执行标号后的命令. 例: }=={} goto noparm ...