问题描述
我有一个变量A,它可以是字符串也可以是数组它的值是A="1,2,3,4,5,6,7,8,9,10,11,12,.....,200"一直到200,也就是A是1到200的数字用,号连接在一起现在有一个变量B,这个变量B有可能是B="2",也有可能B="10,25",也有可能是B="3,18,19,45";也就是说B是200以内的一个或者多个数字,我现在得到B的值后,要从A里把B的值全部去除,得到剩下的值,这要怎么计算感谢大家.
解决方案
解决方案二:
这个根本不是经典问题都算不上程序问题按照,分割得到数组B="2"结果1B="10,25"结果2B="3,18,19,45"结果4然后循环读取就好了
解决方案三:
C#里可以用linq去处理
解决方案四:
vararrA="1,2,3,4,5,6,7,8,9,10,11,12".Split(',');vararrB="3,18,19,45".Split(',');Console.WriteLine(string.Join(",",arrA.Except(arrB)));
不经典,就差集
解决方案五:
引用3楼starfd的回复:
vararrA="1,2,3,4,5,6,7,8,9,10,11,12".Split(',');vararrB="3,18,19,45".Split(',');Console.WriteLine(string.Join(",",arrA.Except(arrB)));不经典,就差集
这个不对,你自己运行看看
解决方案六:
引用4楼pony288的回复:
Quote: 引用3楼starfd的回复:
vararrA="1,2,3,4,5,6,7,8,9,10,11,12".Split(',');vararrB="3,18,19,45".Split(',');Console.WriteLine(string.Join(",",arrA.Except(arrB)));不经典,就差集
这个不对,你自己运行看看
你要的是200,难道我就一定要写200才行?
解决方案七:
string[]arrB="3,5,10".Split(',');StringBuilderstr=newStringBuilder();for(inti=0;i<arrA.Length;i++){boolbl=true;for(intj=0;j<arrB.Length;j++){if(arrA[i].Equals(arrB[j])){bl=false;continue;}}if(bl){if(string.IsNullOrEmpty(str.ToString()))str.Append(arrA[i]);elsestr.Append(","+arrA[i]);}}Console.WriteLine(str.ToString());
解决方案八:
string[]arrA="1,2,3,4,5,6,7,8,9,10,11,12".Split(',');string[]arrB="3,5,10".Split(',');StringBuilderstr=newStringBuilder();for(inti=0;i<arrA.Length;i++){boolbl=true;for(intj=0;j<arrB.Length;j++){if(arrA[i].Equals(arrB[j])){bl=false;continue;}}if(bl){if(string.IsNullOrEmpty(str.ToString()))str.Append(arrA[i]);elsestr.Append(","+arrA[i]);}}Console.WriteLine(str.ToString());
解决方案九:
变量的声明我就不写了,反正都知道是什么样的strA=","+strA+",";foreach(stringiteminstrB.Split(',')){strA=strA.Replace(","+item+",",",");}strA=strA.Trim(',');
解决方案十:
引用3楼starfd的回复:
vararrA="1,2,3,4,5,6,7,8,9,10,11,12".Split(',');vararrB="3,18,19,45".Split(',');Console.WriteLine(string.Join(",",arrA.Except(arrB)));不经典,就差集
正解
解决方案十一:
引用楼主pony288的回复:
我有一个变量A,它可以是字符串也可以是数组
如果类型不确定,这种代码我就不看、不用。
解决方案十二:
引用10楼sp1234的回复:
Quote: 引用楼主pony288的回复:
我有一个变量A,它可以是字符串也可以是数组如果类型不确定,这种代码我就不看、不用。
好像也对,因为字符串本身就是数组嘛,所以可以这样获得一个字符a="abc"[0];这个题其实很简单,不用那么复杂,只要从另一个角度思考就可以了,用现有函数.Replace消除掉字符串中的字符就可以了。
解决方案十三:
引用3楼starfd的回复:
vararrA="1,2,3,4,5,6,7,8,9,10,11,12".Split(',');vararrB="3,18,19,45".Split(',');Console.WriteLine(string.Join(",",arrA.Except(arrB)));不经典,就差集
+1
解决方案十四:
看不出哪里经典了。a=[1,2]b=[1]得到c=[2]这样很难?
解决方案十五:
如果都是数字的话,值得思考一下。可能涉及到效率问题吧,设计算法方面了吧就是,要把要去除的数组b先排序。然后就不用通过遍历源数组删除了,通过二分法什么的,而且b数组也变成是有序的,前面一个数字去除后,后面一个数字查找的范围也会减小,这样如果数量较大的话效率应该会提高不少。