码迷,mamicode.com
首页 > 编程语言 > 详细

数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数

时间:2016-05-14 01:14:44      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:数组查找   移位   

一、在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按从上到下的递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路:

首先选取数组中右上角的数字。如果该数字等于要查找的的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围剔除一行或一列,这样每一步都可以缩小查找的范围。

实现过程如下:

技术分享

技术分享

技术分享

运行结果如下:

技术分享

二、在一组整数中,只有两个数出现了一次,其它数都是成对出现的。

例如:array[10]={1,1,2,2,3,3,5,7,4,4}

思路:我们都知道一个数与它本身异或为零,与零异或为它本身。所以我们可以先让这一组数异或,其结果必不为零,假如为i。然后再从右往左找出i的二进制中第一位为1的,假设右移了count位。然后让数组中的每一个数都右移count位在与i的这一位做与运算,结果为1的为一组,剩下的为另一组,然后在分别异或。便可得出结果。

实现过程如下:

技术分享

技术分享

技术分享

运行结果:

技术分享

若数组如下:

技术分享

运行结果:

技术分享

三、有一组按从小到大排序的数组,经过移位后变成了如下所示。

array[10]={0,1,2,3,4,5,6,7,8,9};

右移两位后:array[10]={2,3,4,5,6,7,8,9,0,1}

右移四位后:array[10]={4,5,6,7,8,9,0,1,2,3,}

右移五位后:array[10]={5,6,7,8,9,0,1,2,3,4}

请设计一个函数,输入一个数查找其是否在移位后的数组中,并不知道数组经过几位移位,要求时间复杂度小于(O(n))。

由于时间复杂度的要求所以不能遍历,虽然数组经过了移位,但其实是被分成了两个有序的部分。主要就是确定要查找的数位于哪一部分,其本质上还是二分查找,如果array[mid]<array[left],说明array[mid]的右边是有序序列,反之则说明它的左边是有序序列。然后在与要查找的数做比较。

具体实现如下:

技术分享

技术分享

技术分享

运行结果如下:

技术分享




本文出自 “流苏” 博客,请务必保留此出处http://ab6107.blog.51cto.com/10538332/1773187

数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数

标签:数组查找   移位   

原文地址:http://ab6107.blog.51cto.com/10538332/1773187

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!