一个数组a[],有99个元素,为1-100中的整数,找出其中缺少的那个数字
利用冒泡排序,可以找出其中缺少的数字,但这里要告诉大家的是另外三个简单的办法。
1,构造一个新数组,把原数组值作键,键作值。然后从1开始遍历新数组,如果某个下标的元素没有值,则这个下标就是原数组所没有的值
2,1到100的和减去原数组的和,差值就是缺少的元素
3,php异或运算的特性
$a^1^2^3^....^100^1^2^3^....^100=$a;
所以只要构造一个1-100的数组,和原数组进行遍历异或运算,就可以找出100数组比99数组多出的那个数字。
代码如下:
class A {
//生成数组
public function create() {
for ($i = 0; $i < 100; $i++) {
$arr[$i] = $i+1;
}
echo '排序之前<br>';
$this->show($arr);
echo '排序之后<br>';
$arr = $this->swap($arr);
$this->show($arr);
return $arr;
}
public function swap($arr) {
for ($i = 0; $i < 1000; $i++) {
$m = rand(0, 99);
$n = rand(0, 99);
$temp = $arr[$m];
$arr[$m] = $arr[$n];
$arr[$n] = $temp;
}
echo '我删除了数字'.$arr[99].'<br>';
unset($arr[99]);
return $arr;
}
public function show($arr) {
$count = count($arr);
for ($i = 0; $i < $count; $i++) {
if (($i+1)%5 == 0) {
echo $arr[$i]."<br>";
} else {
echo $arr[$i].' ';
}
}
echo '<br>';
}
public function method1($arr) {
//键值对换
for ($i = 0; $i < 99; $i++) {
$newarr[$arr[$i]] = $i;
}
for ($i = 1; $i < 100; $i++) {
if (!isset($newarr[$i])) {
echo '缺少元素'.$i.'<br>';
}
}
}
public function method2(array $arr)
{
$sum1 = 0;
$sum2 = 0;
for ($i = 1; $i < 101; $i++) {
$sum1 += $i;
}
$len = count($arr);
for ($i = 0; $i < $len; $i++) {
$sum2 += $arr[$i];
$num = $sum1 - $sum2;
}
echo '缺少元素' . $num.'<br>';
}
public function method3($arr) {
$len = count($arr);
$result = '';
for ($i = 0; $i < $len; $i++) {
if ($i == 0) {
$result = $arr[$i];
} else {
$result = $result^$arr[$i];
}
}
$result2 = '';
for ($i = 1; $i < 101; $i++) {
if ($i == 0) {
$result2 = $i;
} else {
$result2 = $result2^$i;
}
}
$num = $result^$result2;
echo '缺少元素'.$num.'<br>';
}
}
header("Content-type:text/html;charset=utf-8");
$a = new A();
$b = $a->create();
$a->method1($b);
$a->method2($b);
$c = $a->method3($b);