确定只出现曾有两位数字数组

称号:除了外面两个数字为整数数组。其他人物都出现两次。

请敲代码,找了两个数字只出现一次。它需要的时间复杂度O(n),空间复杂度是O(1)。

或深足够的认识。

要思路还是之前的数组中仅仅出现一次的数字的那种模式,一次遍历加上异或运算。那么这个异或的值肯定是这两个仅仅出现一次的数字的相异或的值。那么这个值的二进制表现形式中的1的结果就表示这两个数字在该bit位上不一样。那么通过此举,我们能够以这个bit位是否为1来从整个数组中把这两个仅仅出现一次的数字分开。

通过此举。别的出现两次的数字一会被分到同一组,那么结果就是有两组数据。每组都是奇数个数字。都有仅仅出现一次的数字。

#include<stdio.h>
#include<assert.h>
int findOutTwo(int *a,int n,int &x,int &y){
    assert(a);
    assert(n>2);
    int result=a[0];
    for(int i=1;i<n;++i)
        result^=a[i];
    int b=result&-result;
    x=0;
    y=0;
    for(int i=0;i<n;++i)
    {
        if(b&a[i])
            x^=a[i];
        else
            y^=a[i];
    }
    return 0;
}
int main()
{
    int a[]={1,1,2,2,3,3,4,4,5,6};
    int x,y;
    findOutTwo(a,sizeof(a)/sizeof(int),x,y);
    printf("%d %d\n",x,y);
    getchar();
    return 0;
}

结果为:

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-07-30 03:25:09

确定只出现曾有两位数字数组的相关文章

java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。

1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Map.Entry; 4 //请在小于99999的正整数中找符合下列条件的数,它既是完全平方数, 5 //又有两位数字相同,如:144,676. 6 public class wqs { 7 8 //完全平方数 9 public static boolean iswqs(int n){ 10 int i; 11 double dn=Math.sqrt(n)

js验证连续两位数字递增或递减和连续三位数字相同

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title></head><body><form method="post" class="form-horizontal" role="form" action=&q

完全平方数的末两位数字类型的另一种证明

1. 问题(来自Rosen的<初等数论及其应用>第6版P99第5题) 证明完全平方数的最后两个十进制数字(个位和十位)一定是下列数对之一:{00, e1, e4, 25, o6, e9} 注:e = even number, o = prime number, 0也为偶数 2. 验证一下 n n2 末尾数对类型 0 0 00 1 1 e1 2 4 e4 3 9 e9 4 16 e4 5 25 25 6 36 o6 7 49 e9 8 64 e4 9 81 e1 3. 证明 3.1 思路 要证明

取两位数字,截取数字,求年龄,去除前后空格

//取两位数 function toDou(n) { if(n < 10) { return '0' + n } else { return '' + n } } //截取数字 function getN(s) { if(s) { return s.replace(/[^0-9\.]/ig, ""); } } //去除前后空格 String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ''

输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)

计算完全平方根可以使用math库中的sqrt完成,但需要注意以下几点:a取值应为1-9,b取值为0-9:完全平方得到的结果是浮点型,因为浮点型不像整形可能有误差的存在(TODO:浮点型计算误差),可以使用floor(sqrt(x)+0.5)来减小误差,这里稍微展开说下:如果sqrt(x)的结果本来是1,由于浮点计算的误差导致结果为0.9999,那么cast到int型其结果就是0,因此用四舍五入的方式来减少这种误差(这涉及到浮点型的精度问题,如果精度较高的浮点表示,那计算结果于预期的波动会相对较小

python中保留两位小数

今天写程序的时候碰到了一个问题关于如何控制浮点数只显示小数点后两位,正常的想法是用round函数,例如 round(a, 2),但是在面对下面的问题时候round就不太好用了 >>> a=13.949999999999999 >>> round(a, 2) 13.949999999999999 上网查了资料,有网友提供了一种方法 print('%.2f'%a) >>>13.95 另外还可以用 trunc(a,2)截取函数 >>>13.

iOS中UITextField输入判断小数点后两位

在输入金额的UITextField中,要给予三个规则的判断 1. 只能输入数字(可以通过设置键盘类型为Decimal Pad) 2. 小数点只能有一个 3. 小数点后最多有两位数字 (可以通过正则表达式或者长度判断) 2. 和3. 的代码 (首先引入UITextFieldDelegate,指定代理为自己) - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacem

leetcode之寻找两个有序数组的中位数Golang

算法的要求的时间复杂度是O(m+n) func findMedianSortedArrays(nums1 []int, nums2 []int) float64 { // 获取两个数组的长度 nums1Length := len(nums1) nums2Length := len(nums2) // 总长度 sumLength := nums1Length + nums2Length halfLength := 0 // 确定半长,因为如果总长度是偶数,那么中位数就是两个数字的和除以2,如果总长

input只限制数字和两位小数点

handleInput2(e){ console.log(e) // 通过正则过滤小数点后两位 e.target.value = (e.target.value.match(/^\d*(\.?\d{0,2})/g)[0]) || null }, <el-input @keyup.native="handleInput2" v-model="dataForm.unitPrice" style="width:10%;" ></el-