美文网首页
小问题:求随机给定100个数中相加和为0的3个数

小问题:求随机给定100个数中相加和为0的3个数

作者: 封不然 | 来源:发表于2018-11-09 22:10 被阅读16次

女票去面试,遇到个面试官提了个算法题,问题大概是“求随机给定100个数中相加和为0的3个数”,其实算法题在面试的过程中出到都是很常见的,不过这在短时间内可能很难想到。回来女票问我这个问题,她很好奇我为什么这么快能打上来?emmm,说脑子好使会不会被打,哈哈哈,今天来讲下这类题的一种套路。

1.遇到数,先排序,没错的

在遇到问题没有立马出现思路我觉得这是非常正常的事情,但是可以很明确的说,在对于数做操作的时候,有序会比无序好操作的多,毕竟有序的时候我可以采取的方式也就会更多。

2.3个数不好想,那转换成2个呢?

这其实描述性的来说,就是把复杂问题简单化。就拿这个问题来说吧,我在100个数里面取三个数的和为0可能很难处理,最笨的方法就是三层循环,o(n^3),在实在想不出来的时候,就说这个吧。

但是转念想想,如果我们把这个问题转化为,求两个数的和等于另一个数的相反数呢?这是不是就有了点眉目了呢?

3.问题变为了,有序的100个数中,求两数和 为 x的项,是不是开始才思泉涌

具体讲下大概的算法,将100个数排序后存到数组 a 中,开始循环数组a,索引为i,然后分别取两头索引left,right对应的值a[left], a[right]的和是否等于该a[i],在不相等时,在根据 a[left] + a[right] 和与 a[i] 的大小关系,来判断是将left+1 还是讲 right + 1 再进行比对。

4.写出大体代码

如果觉得语言描述不清,写出能代表你基本思路的代码即可,也不需要能够严格执行,最擅长php,就以php为例

$left = 0;
$right = count($a) - 1;
foreach($a as $i => $sum) {
    $_left = $left;
    $_right = $right;
    while($_left < $_right) {
        if($a[$_left] + $a[$_right] < -$a[$i]) {
            $_left ++;
            if($_left == $i) $_left ++;
        } elseif ($a[$_left] + $a[$_right] > -$a[$i]) {
            $_right --;
            if($_right == $i) $_right --;
        } else {
            return '结果相加和为0的组合之一为:...';
        }
    }
}

5.基本完成了,就该想办法优化了

暂时能想到的优化
(1) 有相同的数的话,就直接略过了,外层设置个has_read数组,外层a[i] 都填进去,当循环条件为 in_array(a[i], $has_read) 的时候 continue;

结论

这类的题目,我觉得按照大体思路这么跑,就可以,无非有序化,简单化的事情,后面这种题万变也不离其宗,无非是这几个数的三次幂啊,求几个数的积啊之类的。

你还有更好的解法吗?或者有什么有意思的题目,欢迎分享。

相关文章

  • 小问题:求随机给定100个数中相加和为0的3个数

    女票去面试,遇到个面试官提了个算法题,问题大概是“求随机给定100个数中相加和为0的3个数”,其实算法题在面试的过...

  • 求三个数和为0

    题目描述: 给定一个数组,要求在这个数组中找出 3 个数之和为 0 的所有组合。 Example: 算法思路 使用...

  • leetcode two-sum

    题目 给一个数组和一个和,查找出数组中两个数相加为给定的和 Given an array of integers,...

  • 18. 4Sum 四数之和

    题目 给定一个数组 nums 和目标数 target。找到 四个数字使得这四个数相加等于目标数。 解析 和三数相加...

  • 【python程序员代码面试指南】未排序正数数组中累加和为给定值

    题目:给定一个数组arr,该数组无序,但每个值均为正数,再给定一个正数k。求arr的所有子数组中所有元素相加和为k...

  • 斐波拉契数列

    斐波拉契数列,数列第一个数为0,第二个数为1,其后的每一个数可由前两个数相加得到:0、1、1、2、3、5、8、13...

  • 标示符+基本概念+console.write

    Console.WriteLine("两个数相加{0}+{1}={2}", 3, 34, 34);:{0},表示标...

  • JS_BasicPractice_1

    题目 1.求两个数的余数 给定两个数字,求第一个数字除以第二个数字后所得的余数。例子:给定 9 和 4,返回 12...

  • LeetCode

    Two Sum 描述:给定一个数组num[]和一个数字target,若数组中有两个数字相加等于target在,则输...

  • day7homework

    1.已知一个数字列表,求列表中心元素。元素个数为单数 元素个数为偶数 2.已知一个数字列表,求所有元素和。 3.已...

网友评论

      本文标题:小问题:求随机给定100个数中相加和为0的3个数

      本文链接:https://www.haomeiwen.com/subject/eahwxqtx.html