求救,脑子不够用了,写组合~~~

meinv678 2017-01-20 05:27:26
工作太累了,脑子动不起来了,来求救。。。

byte[] str = { 17, 16, 15, 15, 15, 14,14,14, 13,13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3};

请把 这个做组合。。。。

不能重复
例如
3
4
5 4 3
15 15 15 14

不能重复
每个组合保存在 new byte[]里面。。。注意顺序,大数要排前面 ,也就是 byte[0] 里面是最大的。。。

求代码!!!
谢谢!!!!
...全文
720 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
meinv678 2017-01-22
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
比如说,你要保留前 50 个结果到数组中,你可以写
byte[] str = { 17, 16, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3 };
var results = 排列(str).Take(50).ToArray();
看看 results 是什么类型的?你的问题的设计中,类型说明对吗?
多谢你,我会好好看看你说的!
meinv678 2017-01-22
  • 打赏
  • 举报
回复
多谢你,我自己好好看看你说的,谢谢!
meinv678 2017-01-21
  • 打赏
  • 举报
回复
额,就是求组合呀。。。。
exception92 2017-01-21
  • 打赏
  • 举报
回复
引用 2 楼 daixf_csdn 的回复:
看不懂你说什么,有看懂的没?
没看懂,太高深
圣殿骑士18 2017-01-21
  • 打赏
  • 举报
回复
看不懂你说什么,有看懂的没?
  • 打赏
  • 举报
回复
比如说,你要保留前 50 个结果到数组中,你可以写
byte[] str = { 17, 16, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3 };
var results = 排列(str).Take(50).ToArray();
看看 results 是什么类型的?你的问题的设计中,类型说明对吗?
  • 打赏
  • 举报
回复
这里无关“优化”问题,某些结构稍微调整,或者算法从前往后还是从后往前递归的问题,在数据结构上会有一些小小的“优化”结果。不过那些都微不足道!比如说我故意用“start、end”两个变量来作为说明(成文自明),而不是仅仅用一个 index 变量来做为算法指针。 关键地,你看算法的逻辑,非常简单,只有简单的6、7行代码。哪有你在 #1 楼的那么复杂?
  • 打赏
  • 举报
回复
首先你要理解 c# “迭代器”的设计模式,如果没有这个基本概念,就要优先去研究它。思想比伎俩更重要。于是可以把算法的接口定义出来
static IEnumerable<List<byte>> 排列(byte[] str)
以及测试主程序
//byte[] str = { 17, 16, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3 };
byte[] str = {6, 5, 4 };
var n = 0;
foreach (var result in 排列(str))
{
    Console.Write("第{0}个结果:", ++n);
    foreach (var x in result)
        Console.Write("{0} ", x);
    Console.WriteLine();
}
其次,你应该整理一下、测试自己有没有在学校里学好“递归”的理论知识和实践。没有这个基础的人基本上都是“混的”,理科考试成绩很差。递归的思路你可以自己用自然语言来解释一下类似下面这样的程序(其实很简单),就看你有没悟性了:
static IEnumerable<List<byte>> 排列(byte[] str, int start, int end)
{
    if (start == end)
        yield return new List<byte> { str[start] };
    else
    {
        yield return new List<byte> { str[start] };
        foreach (var r in 排列(str, start + 1, end))
        {
            yield return r;
            var copy = r.ToList();
            copy.Insert(0, str[start]);
            yield return copy;
        }
    }
}
static IEnumerable<List<byte>> 排列(byte[] str)
{
    if (str.Length > 0)
        foreach (var r in 排列(str, 0, str.Length - 1))
            yield return r;
}
meinv678 2017-01-21
  • 打赏
  • 举报
回复
啊,要是简单,我也不会找人了。。。可怜
我是三峡移民 2017-01-21
  • 打赏
  • 举报
回复
这组合的情况也太多了吧,还要考虑重复值的问题,高中排列组合也早就忘了吧
游离失所 2017-01-21
  • 打赏
  • 举报
回复
我也硬是没看懂
meinv678 2017-01-20
  • 打赏
  • 举报
回复
帮我改改这个也行,这个有重复,注意性能问题。。。。。 byte[] str = { 17, 16, 15, 15, 15, 14,14,14, 13,13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; for (int i = 1; i <= str.Length; i++) { Combine(str, i); } private void Combine(byte[] seeds, int count) { if (count > seeds.Length || count < 1) throw new ArgumentOutOfRangeException("count"); int len = seeds.Length; int[] indexes = new int[count]; byte[] result = new byte[count]; result[0] = seeds[0]; int pos = 0; while (true) { if (pos < count - 1) { indexes[pos + 1] = indexes[pos] + 1; pos++; result[pos] = seeds[indexes[pos]]; } else { //result byte[] dstArray = new byte[result.Length]; Buffer.BlockCopy(result, 0, dstArray, 0, result.Length);//这里保存 if (indexes[pos] < len - 1) { indexes[pos]++; result[pos] = seeds[indexes[pos]]; } else { bool isEnd = true; for (int i = count - 2; i >= 0; i--) { if (indexes[i] < len - count + i) { pos = i; indexes[pos]++; result[pos] = seeds[indexes[pos]]; isEnd = false; break; } } if (isEnd) break; } } } }

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧