怎么用EXCEL从一堆数据中找出包含这几个数的地方,顺序不限
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用EXCEL从一堆数据中找出包含这几个数的地方,顺序不限相关的知识,希望对你有一定的参考价值。
比如说这堆数据每7个一组,我指定了7个数字:1234567,怎样找出哪些地方包含这7个数字其中的5个以上,顺序不限。
举个例子, 数据在A列
D1=1234567 (指定的7个数字)
B1数组公式
=IF(COUNT(FIND(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),D$1))>4,"符合","")
注意数组公式的输入方法, 先在B1输入一个=号, 再粘贴=号后面的公式, 然后同时按 Ctrl+Shift+回车 三键结束. 切记!!! 否则结果不正确.
正确输入公式后, 公式栏中的公式两端会自动出现一对大括号 , 这是数组公式的标志, 是自动生成, 而不是人为输入的.
下拉
追问
哈哈,终于解决了,原来是要下拉的呀!我还以为是直接框选呢,太感谢了。
参考技术A 使用 find()函数比如:
A2=“广东省东莞市东城区…”,A3=“黑龙江省哈尔滨市…”; 对含有不同地方的数据,利用“Find”函数,非常简单地确定“省”出现的位置。
公式“=FIND("省",A2)”中,“省”表示要查找的文本为“省”,(实际使用中,也可以很长的一串字符)。要找查找的对象是A2单元格的内容“广东省东莞市东城区…”,因为没有指定起始位置,所以系统从第一位开始。返回的“3”,表示“省“字在第三位。
而公式“=FIND("省",A3)”中,“黑龙江省哈尔滨市…”则返回4。
注:FIND函数,第一位查找内容,如果是文本的话,必须添加英语输入法下的双引号,否则函数无法计算。
如何从一堆数中选出若干个数,使其和等于给定的数?
如题,比如有一堆数:13,2,4,2,4,8,7,8,6
要从中挑选出若干个数,使得它们的和等于32,挑选出来的数是:20,6,4,2
我是使用“试探”法来解这个题目,思路如下:
先对数进行排序:13,8,8,7,6,4,4,2,2
选出最大的数字,以及不大于目标数字后续数字,于是我挑选到了13,8,8,其和是29,如果这个时候再挑选7的话就会超过32,所以就跳过,尝试在后面找到合适的数字,找到4,加上仍然大于32,再接着找到2,这次好了,加起来是31。
再次向后面寻找小的数字的时候,发现没有合适的数字了。于是就“退回去”到最后一个选中的数字2那里,取消掉2的选择,选择下一个更小的数字:
但不幸的是仍然不符合要求,而且已经到底了,所以还要往前退,退到8,取消对8的选择,选择更小的数字7:
再尝试选择小于等于32的数字,6不符合,跳过,4,正好符合,13+8+7+4=32,挑选数字完成!
好,算法描述好了,如何用代码来实现?
这种不知道要循环多少次的问题最好还是用递归来处理,把这个问题简化成以下的问题:
具体代码见下:
public class CombineHelper { private readonly int[] _array; private readonly bool[] _chosenFlags; //排序,初始化 public CombineHelper(IEnumerable<int> numbersToFetch) { Debug.Assert(numbersToFetch!=null); _array = numbersToFetch.OrderByDescending(i => i).ToArray(); _chosenFlags = new bool[_array.Length]; } //找组合 public List<int> FindCombination(int value) { //初始化flags for (int i = 0; i < _chosenFlags.Length; i++) { _chosenFlags[i] = false; } if (Find(value, 0)) { //生成结果返回 List<int> result = new List<int>(); for (int i = 0; i < _chosenFlags.Length; i++) { if (_chosenFlags[i]) { result.Add(_array[i]); } } return result; } throw new Exception("无法组合"); } private bool Find(int value, int startIdx) { int i = startIdx; if (i == _array.Length) { return false; } //跳过 if (_array[i] > value) { return Find(value, i + 1); } //匹配成功 if (_array[i] == value) { _chosenFlags[i] = true; return true; } //_array[i] < value,尝试选择当前这个数并在后面的数中再去匹配余数 for (int step = 0; i + step < _array.Length; step++) { if (Find(value - _array[i + step], i + step + 1)) { _chosenFlags[i + step] = true; return true; } } return false; } }
这段代码除开一些封装/初始化的部分之外,也没几行了,真正有用的就是Find方法,递归的代码就是简洁。用法示例:
List<int> sourceList = new List<int> {13,2,4,2,4,8,7,8,6}; CombineHelper combineHelper = new CombineHelper(sourceList); List<int> result = combineHelper.FindCombination(33); foreach (int i in result) { Console.WriteLine(i); }
以上是关于怎么用EXCEL从一堆数据中找出包含这几个数的地方,顺序不限的主要内容,如果未能解决你的问题,请参考以下文章