阿里交叉面 这题咋做啊!!!

算法题写胡了好绝望啊!!!!

一个连续数列,任意取出两个数字,再将数列打乱。问这两个数字分别是多少?

要求时间On空间O1

啊啊啊啊!咋做啊


——————————————

比如原来
2 3 4 5 6 7 8 9(连续的)
取出来3 5
再打乱
变成
9 2 4 8 7 6(你只知道这个)
求你取出来的是什么

——————————
你们想的最好的方法是啥?
当时我一开始想到时间n空间n
让我空间压成常数,
我就傻了

你们想到的最优方法是啥?



#阿里##阿里巴巴##面试题目#
全部评论
这种题目的正经解法其实是,用你的样例说明的话,最小值是2,长度为6,第一轮遍历数组,比如说9,9-2等于7,超出index范围了不做处理,然后是2,2-2等于0,将index等于0的变成负数,往后走,4,8,7,6同理,分别是2,6(超出范围不做处理),5,4的index的数变成负数,然后第二次遍历统计为正的数的位置,分别是1和3,所以缺失的是3和5。当然还有别的情况,比如说全都是负的,那么缺失的是最大的两个,或者最小得两个,或者就一个负数,这个就需要记录之前数组中的最大值,看看是最大得两个中的哪个缺失了。
6 回复 分享
发布于 2020-04-28 03:41
把取出前和取出后的数字看做整体,题目就变成数组中只有两个数字出现一次,其他出现两次,用异或可以做,leetcode上有
5 回复 分享
发布于 2020-04-30 13:51
假设最小值是x,然后一共有n个数(n已知),缺少的两个数是a,b 可以算出来 所有数和的一次方-a-b=f1(x+n-1)-f1(x-1) 所有数和的二次方-a^2-b^2=f2(x+n-1)-f2(x-1) 所有数和的一次方-a^3-b^3=f3(x+n-1)-f2(x-1) f1(x)=(1+x)*x/2 f2(x)=(2*x+1)*x*(x+1)/6 f3(x)=((1+x)*x/2)^2 如果方程解不出来的话 还可以继续上四次方五次方😁
3 回复 分享
发布于 2020-04-27 23:01
我投5楼一票,如果允许在输入的乱序数组上操作,就好办了。 比如对于9、2、4、8、7、6。 先遍历一次得到最小值是2,长度是6,那么原长度就是8。添加两个变量null表示数组后面延长两个位置,把数组补充成长度8,变成: 9 2 4 8 7 6 null null 然后遍历数组,把每个数x交换到x-2的位置,数组的变化情况是: null 2 4 8 7 6 null 9 2 null 4 8 7 6 null 9 2 null 4 null 7 6 8 9 2 null 4 null 6 7 8 9 然后遍历一次数组,看null在哪就可以了。 不过这题答案可能不唯一,null出现在开头或结尾时,答案就有多种可能,比如最后的数组如果使是: 2 3 4 5 null 7 null 那{6, 8}和{1, 6}都是答案。 如果是2 3 4 5 null null 那{6, 7} {1, 6} {0, 1}都是答案。
2 回复 分享
发布于 2020-04-30 12:00
我觉得可以按四楼的方法先求出a+b,然后以(a+b)/2为界把数组分成两组,然后再用那个方法对新的两个数组再分别求一下就得到了a和b
1 回复 分享
发布于 2020-04-28 12:28
题目描述不太对吧?我取出来了,然后呢
点赞 回复 分享
发布于 2020-04-27 21:42
题目表述不清晰,,,怎么让大家看呀
点赞 回复 分享
发布于 2020-04-27 21:46
呜呜呜我傻了
点赞 回复 分享
发布于 2020-04-27 21:52
刚刚我也糊了,,,,楼主还有后续吗?😫
点赞 回复 分享
发布于 2020-04-30 13:40
异或应该能成
点赞 回复 分享
发布于 2020-04-30 14:00
这是在干嘛,我题目都没有看明白😂
点赞 回复 分享
发布于 2020-09-07 18:30

相关推荐

点赞 8 评论
分享
牛客网
牛客企业服务