一、在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按从上到下的递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
首先选取数组中右上角的数字。如果该数字等于要查找的的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围剔除一行或一列,这样每一步都可以缩小查找的范围。
实现过程如下:
运行结果如下:
二、在一组整数中,只有两个数出现了一次,其它数都是成对出现的。
例如: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