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打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...
随机推荐
- bootstrap基础样式学习(二)——栅格
(1)最外层必须使用容器 div.container或 div.container-fluid (2)容器可以放置任何内容,若想使用栅格系统必须用 div.row div.container > ...
- Linux内存管理(最透彻的一篇)【转】
转自:https://www.cnblogs.com/ralap7/p/9184773.html 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物 ...
- day22_7.26面向对象之封装(接口与抽象)
一.封装. 封装就是将丑陋复杂的隐式的细节隐藏到内部,对外提供简单的使用接口. 对外隐藏内部实现细节,并提供访问的接口.对内使用self操作. 二.为什么要封装? 对于一个计算机来说,不可能不使用机箱 ...
- 【转】Spring全家桶
Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶.它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflo ...
- Socket-window通讯
#define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WINSOCK2.H> #include<STDIO.H> #include& ...
- java修饰符的总结
引言:Java的修饰符根据修饰的对象不同,分为类修饰符.方法修饰符.变量修饰符,其中每种修饰符又分为访问控制修饰符和非访问控制修饰符.访问控制存在的原因:a.让客户端程序员无法触及他们不应该触及的部分 ...
- zz深度学习在美团配送 ETA 预估中的探索与实践
深度学习在美团配送 ETA 预估中的探索与实践 比前一版本有改进: 基泽 周越 显杰 阅读数:32952019 年 4 月 20 日 1. 背景 ETA(Estimated Time of A ...
- JDOJ 2255 A+B Problem
JDOJ 2255: A+B Problem https://neooj.com/oldoj/problem.php?id=2255 Description Solve A+B problem wit ...
- 复杂模拟 | 1014 模拟K个同时到来的人在N个窗口,每个窗口只能站M个人的银行排队
这题我以为还是之前银行排队的思路,但是做着做着就做不下去了了.看了答案我才理解到底是什么个思路. 是这样的:不同于之前排队的题,这里的K个人是同时到来的.所以首先应该让K个人的前N*M(也就是黄线内的 ...
- 树的遍历 | 1079 理解题意+DFS
这题如果读懂了题意,就很好做,一波操作就结束了.不过题目有点难读,考验耐心和读题的细致. AC代码: #include <stdio.h> #include <memory.h> ...