每个软件工程师都应该在 1 个小时内解决的 5 个编程问题 [悲剧版]

2015-05-09 14:08:23 +08:00
 jacob

最近很火的讨论,简单整理了一些: http://segmentfault.com/a/1190000002746474

5479 次点击
所在节点    分享发现
56 条回复
lincanbin
2015-05-09 14:15:23 +08:00
美国 圣地亚哥

这不是国内大学生编程课的基础吗?
lincanbin
2015-05-09 14:20:26 +08:00
里面可能大学生可能会卡壳的:也就是斐波那契数列前100位的和的值的长度,已经超过了64位整形所能表示的长度。
当然这个问题其实也不是问题,稍微思考一下也能解决。
semicircle21
2015-05-09 14:20:56 +08:00
哈哈哈哈, 看到结尾释然了, 第四题的时候, 我也突然心中一凉...
dangge
2015-05-09 15:41:56 +08:00
大一狗看完后表示 稍微刷点算法题应该都能写完...
歪果仁是有多弱...
PS:Q4想了一下 只会笨拙的暴力比较...有什么好的算法吗?
9hills
2015-05-09 16:02:36 +08:00
@dangge 将正整数队列转换为字符串队列并排序即可
c742435
2015-05-09 16:06:25 +08:00
都会但是估计全调完不止一个小时欸。
dangge
2015-05-09 16:23:35 +08:00
@9hills 还可以再优化一点,取字符串首位比较
raincious
2015-05-09 16:30:35 +08:00
@dangge

何止,你需要用到树。

先转换整个整数到字符串,然后做个解析器,将字符串一个个解析出来,然后转换回整数,用插入排序的方式在插入树的时候就将数字排序好。

用题目上的例子,树应该应该像这样:

[50,2,1,9]

1
2
5 - 0
9

然后迭代这个树就行了。
9hills
2015-05-09 16:42:52 +08:00
@dangge 字符串比较就是顺序比较。

@raincious Python one line
a=[50,2,1,9]
print int("".join(sorted(map(str,a), reverse=True)))
>> 95021
zsx
2015-05-09 16:46:17 +08:00
@raincious
第四题不是一个全排列然后排序不就好了吗……

``javascript

(function(arr) {
var resultArray = [];
(function fn(source, result, callback) {
if (source.length == 0) {
callback(result);
} else {
source.forEach(function(item, index) {
fn(source.slice(0, index).concat(source.slice(index + 1)), result.concat(item), callback);
})
}
})(arr, [], function(arr) {
resultArray.push(arr.join(""));
});
resultArray.sort();
console.log(resultArray[resultArray.length - 1]);
})([50, 2, 9, 1]);

``
zsx
2015-05-09 16:49:25 +08:00
@zsx 效率另说,反正不是算法题(笑
9hills
2015-05-09 16:52:56 +08:00
人生苦短,我用Python。楼上 js的世界我真的不懂。
zsx
2015-05-09 16:58:58 +08:00
@9hills
对不起我错了……

[50, 2, 9, 1].map(function(a){return a.toString()}).sort().reverse().join("")
zsx
2015-05-09 17:00:21 +08:00
@9hills

[50, 2, 9, 1].map(String).sort().reverse().join("")

然而我似乎忘记了String()函数……
raincious
2015-05-09 17:08:58 +08:00
@9hills

简单+漂亮。

看到了你的答案我就在PHP里试了一下……

$numbers = [50,2,1,9];

rsort($numbers);

string(5) "50921"

// PHP 你好聪明,知道这是Int,于是还得用usort自己做个比较函数……
imn1
2015-05-09 17:20:27 +08:00
我觉得确实是基础
只有斐波那契数列那个不能随手写出来,因为实际工作中没怎么遇到相关的需求,以前写过就忘了

其他四个都在实际工作中(各种业务)不定时遇到
Q2/Q4很常见,尤其是Q4,比价常用,Q2则是分类中、或者多次select后合并常用的
raincious
2015-05-09 17:21:29 +08:00
@9hills

等等,这不对啊……

如果用[50,500]来做测试,你看

>>> b=[50,500]
>>> print int("".join(sorted(map(str,b), reverse=True)))
50050

期待的值应该是
50500
xjx0524
2015-05-09 17:21:34 +08:00
@9hills 字符串排序[56,50,5]结果就是56505 实际应该是56550
batman2010
2015-05-09 17:30:27 +08:00
#!/usr/bin/perl -w
use strict;

sub largest {
my @arr = @_;
my $res;
my @arr2 = sort {$b . $a cmp $a . $b} @arr;
my $iter = 0;
while ($iter < @arr2) {
$res .= $arr2[$iter++];
}
return $res;
}

#main
my @array = (50, 2, 1, 9);
print largest(@array), "\n";
batman2010
2015-05-09 17:30:56 +08:00
@batman2010 俺定的 Q4

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/189719

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX