周五去面试遇到一个算法题,C# 根据整数数组,求最大组合数

tomcat 2019-03-02 08:19:41
根据输入的整数数组,求最大的组合数

例如输入:[14,58,8,5,9],输出最大组合数为9858514。

大家有几种解决方法?
...全文
3055 91 打赏 收藏 转发到动态 举报
写回复
用AI写文章
91 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
写了个三目运算:

            var dd = "14,58,8,5,9,7,11,19,15,17,13,1".Split(',').Select(aa => int.Parse(aa)).ToList();
            dd.Sort((ss, ee) => (int.Parse(ss.ToString() + ee.ToString()) > (int.Parse(ee.ToString() + ss.ToString()))) ? -1 : 1);
            shu.Text = string.Join(" ", dd);//1大于0等于-1小雨
yxz_lp 2019-03-28
  • 打赏
  • 举报
回复
字符串倒叙显然有问题,如果第一位相同,还要比较最后以为的大小

List<string> ls = new List<string> {"52", "3", "5"};
ls.Sort(delegate(string s1, string s2)
{
if (s1.First().CompareTo(s2.First()) == 0)
return s1.Last().CompareTo(s2.Last());
return s1.First().CompareTo(s2.First());


});
ls.Reverse();
Console.WriteLine("最大组合:");
foreach (string str in ls)
{
Console.Write(str);

}
  • 打赏
  • 举报
回复
回复贴子https://bbs.csdn.net/topics/392559541还真的有另一种算法:

var dd = "14,58,8,5,9,51,18,52,25,3".Split(',').Select(aa => int.Parse(aa)).ToList();
dd.Sort((ss, ee) => -(int.Parse(ss.ToString() + ee.ToString()).CompareTo(int.Parse(ee.ToString() + ss.ToString()))));
this.Text = string.Join(" ", dd);
  • 打赏
  • 举报
回复
话说回来,难道这世界上就属快排算法最好了?有点不信!
2019年3月14日下午不经意间创作出一种新的排序算法,运算次数均为数组元素量,由于是业余的编程爱好者,不知道如何按标准测试,以及新排序算法诞生有何意义?特此记录一下。
wanghui0380 2019-03-11
  • 打赏
  • 举报
回复
这个很难说,如果说全排考基础能力,那么考算法复杂度不也是一种考法。

Sort 快排的算法复杂度低,所以我才说怎么考都行,主要看思维方向,解决问题的思路
  • 打赏
  • 举报
回复
饭馆上一盘菜,是因为明确公开的信息就是如此。不可以非要因为自己的脑子里想到了一盆菜而要求饭馆必须上一盆,要以测试为准,而不是自己的想象为准。
  • 打赏
  • 举报
回复
“考虑到有人会想到用全排,因此,只给出5个数据”?这个就是与现实正相反的揣摩了。比如说你去饭馆点一个菜,饭馆给你上一盘而不是一盆食物,你说“店家可能考虑到有人只吃一盘菜因此才只上一盘菜”,这个就是直接挑剔实事求是的东西了。不是什么“估计有人用全排”所以才不出一个专门用来“玩儿的”题目,而是意图就是看一个人的工程师素质而不需要看一个人拿着普通的一个界面功能开发题目也非要强调“我要先设计开发一个操作系统,然后才做您这个题目”的爱好。
  • 打赏
  • 举报
回复
若论考题的意图,估计出题人可能考虑到有人会想到用全排,因此,只给出5个数据,假如数据量翻倍的话,如给10个数据,或给15个数据,估计全排够呛,全排思路是对的,但数据量多的话,考官会等待全排出结果?估计不好说了! 回过来说,用冒泡的话,若平时没遇到还真一时想不出来的,进过一番推理后才发现原来冒泡就可以实现,也是需要时间思考的,发表后回头看看他人有什么好的解决办法,是会发现有殊途同归的办法。 以本贴说,结论只有2种办法是可信的。
  • 打赏
  • 举报
回复
我们在面试时,就像扫描仪一样地迅速做出即时判断,并且根据应聘者的回答内容而即刻想出追问的问题。实际上都是用固定的节奏来判断一个人的组合素质,基本上不会去招聘一个成景润式的钻研1+2的人物,而是招聘某个行业的工程师式的人物。
  • 打赏
  • 举报
回复
这个题目如果出在面试时(而不是平常有大量闲工夫时),那么应聘者应该有个基本判断,是考什么知识的。 其实首先是考一个人能不能立刻得到“正确的”结果,而不会留出足够得时间允许一个人发呆。 其实所有的东西都可以用诡异地收发另类求解,关键是临场判断对方的用意,而不是问题本身。
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
 int[] list=new int[] { 14, 58, 8, 5, 9 };
int maxlenth = list.Max(p=>p.ToString().Length);

string res = string.Join("", list.Select(p => new { value = p, str = p.ToString().PadRight(maxlenth, '0') }).OrderByDescending(p => p.str).Select(p=>p.value));

Console.Write($"结果:{res}");
Console.ReadKey();

按其提供的程序看应该是补0那么是不正确的说明不是客观规律。
假如按最后一位数补位的话,那么,是否就符合客观规律?
  • 打赏
  • 举报
回复
quote]补位啥意思[/quote]
引用 68 楼 Zhang Yiqiang 的回复:
[quote=引用 9 楼 无情时尚 的回复:][quote=引用 7 楼 wanghui0380 的回复:] 先求maxlength 然后补位 按补位后排序 然后排补位排序值拼接原始数据
这种思路和方法比较好,值得学习![/quote]补位啥意思[/quote] 他的意思大致是,例如最大位数是5位,那么对于数字 51 就要“补”为 51111,对于 3 就要“补”为 33333,以结果数字作为“索引键”对原数值排序。
  • 打赏
  • 举报
回复
按数位比较是很复杂的,也没什么规则可言,尤其是位数多了,处理更复杂,我这里用按数位合成倒是免去转来转去的麻烦,于是冒泡即可改:

这样替换任何排序都可行可看。
Zhang Yiqiang 2019-03-06
  • 打赏
  • 举报
回复
引用 9 楼 无情时尚 的回复:
[quote=引用 7 楼 wanghui0380 的回复:]
先求maxlength
然后补位
按补位后排序
然后排补位排序值拼接原始数据

这种思路和方法比较好,值得学习![/quote]补位啥意思
CX8751418 2019-03-06
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
int[] array = { 14, 58, 8, 954, 96, 9 };
string newstr = GetMaxNum(array);
Console.WriteLine(newstr);
Console.ReadKey();
}

static string GetMaxNum(int[] array)
{
string str = string.Empty;
int maxlenth = array.Max(p => p.ToString().Length);

str = string.Join("", array.Select(p => new
{
value = p,
orderby = p.ToString().ToCharArray()[0],
thenby = p.ToString().Length == 1 ? Math.Pow(10, maxlenth - p.ToString().Length) : Convert.ToInt32(p.ToString().Remove(0, 1)) * Math.Pow(10, maxlenth - p.ToString().Length)
}).OrderByDescending(s => s.orderby).ThenByDescending(s => s.thenby).Select(s => s.value));
return str;
}
wanghui0380 2019-03-06
  • 打赏
  • 举报
回复
就像楼上两位C++的人说的其实核心是 比较
a+b>b+a

可以看出C++的基础还是扎实,手段还是灵活。 所以如果是招聘我说脑筋急转弯的我要,写死组合的我也要。各有各的位置,各有各的用法
wanghui0380 2019-03-06
  • 打赏
  • 举报
回复
有关面试这种事情,不是那种非得如何的事情
比如曾经的一道题
1-2+3-4+5------- +100001
这题可不是我编的吧,我相信很多人看过这面试题

你是写循环,让机器算呢?还是说脑筋急转弯呢?

so,到底人家考什么,我不想考究,我只想说如果面试,在那么十几分钟的时间表现出合适的表达就ok

实际上计算机领域没那么严格,不管中科院的老院士说“现在的神经网络,深度学习根本就不能算AI”,但是实际上现在就是这么做的。
  • 打赏
  • 举报
回复
12112 12.111=1211212(1212112)
512 51.1=51251(51512)
上面针对补头和补尾,我设计了2个数进行验证,足以证明

Console.Write("结果:{" + string.Join("", 数组.Select(p => new { value = p, str = p.ToString().PadRight(数组.Max(q => q.ToString().Length), p.ToString().First()) }).OrderByDescending(p => p.str).Select(p => p.value)) + "}补头\r\n");
Console.Write("结果:{" + string.Join("", 数组.Select(p => new { value = p, str = p.ToString().PadRight(数组.Max(q => q.ToString().Length), p.ToString().Last()) }).OrderByDescending(p => p.str).Select(p => p.value)) + "}补尾");
Console.ReadKey();

  • 打赏
  • 举报
回复
引用 80 楼 智者知已应修善业 的回复:
[quote=引用 76 楼 胖叔叔写代码 的回复:] 根据输入的整数数组,求最大的组合数 正确的解答思路是这样,首先比较首位挑选最大的,当首位最大一致的时候对首位之后的数字沿用前规则比对,直到返回一个max为止。 那么我们可以预见的测试数据就有如下几种: 4321,4,3,2,1 最大44321321 4321,5,4,3,1 最大 54432131 4321,4,4,3,1 最大44432131 4321,4,3,1,1 最大44321311 3421,4,3,2,1 最大43421321 如果你发现一个合适的算法,套用一下这些数字看输出是否符合预期即可。 因此很多偷懒的方法都不合适。
那么,2位和3位如何比较?514,51[/quote] 我们用你的例子选择第一个数字 原始数组 514 51 组合1 514(51 组合2 515(14 比较到第三位获取到组合2较大,取走组合2的组合结果51514,移除数组中已经消耗的数字 51 514
加载更多回复(71)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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