【牛客网】数组中只出现一次的数字

本文介绍了一种高效的算法,用于从整数数组中找到仅出现一次的两个数字。利用异或运算的特性,通过位操作实现时间复杂度为O(n)的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 题目:
    一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

  • AC的代码:

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int a[100] ,flag=0;
        for (int i = 0; i < data.size(); i++){
            a[i] = 1;
        }
        for (int i = 0; i < data.size(); i++){
           for (int j = 0; j < data.size(); j++){
               if(j==i)continue;
               if (data[i] == data[j])a[i] ++;
           }
       }
       for (int i = 0; i < data.size(); i++)
       {
          if (a[i] == 1 && flag == 0){
              *num1 = data[i];
              flag = 1;
          }
         if (a[i] == 1 && flag == 1)*num2 = data[i];
       }
    }
};//时间复杂度为O(n(2)),无法达到要求
  • 剑指Offer上的代码
#include<iostream>
using namespace std;
unsigned int FindFirstBitIs1(int num){
    int indexBit = 0;
    while (((num & 1) == 0) && (indexBit < 8 * sizeof(int))){
        num = num >> 1;
        ++indexBit;
    }
    return indexBit;
}
bool IsBit1(int num, unsigned int indexBit){
    num = num >> indexBit;
    return (num & 1);
}
void FindNumsAppearOnce(int data[], int length, int* num1, int* num2){
    if (data == NULL || length < 2)
        return;
    int resultExclusiveOR = 0;
    for (int i = 0; i < length; i++)
        resultExclusiveOR ^= data[i];
    unsigned int indexof1 = FindFirstBitIs1(resultExclusiveOR);
    *num1 = *num2 = 0;
    for (int j = 0; j < length; j++){
        if (IsBit1(data[j], indexof1))
            *num1 ^= data[j];
        else *num2 ^= data[j];
    }
}//注意异或运算的性质:任何一个数字异或自己都等于0
### 如何在Node.js中实现类似牛客网的输入输出操作 #### 单行输入与输出 对于简单的单行输入场景,可以使用 `readline` 模块来读取标准输入流并解析数据。以下是基于 Node.js 的示例代码: ```javascript const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', function (line) { const tokens = line.split(' '); const result = parseInt(tokens[0], 10) + parseInt(tokens[1], 10); console.log(result); // 输出计算结果 rl.close(); // 关闭接口 }); ``` 上述代码通过监听 `'line'` 事件获取每行输入,并将其分割成数组进行处理[^2]。 --- #### 多行输入与动态结束条件 当题目涉及多组测试用例或多行输入时,通常需要设置特定的终止条件(如空行或指定数量)。以下是一个支持多行输入的例子: ```javascript const readline = require('readline'); let lines = []; const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', function (line) { if (line.trim() === '') { // 如果遇到空白行,则停止接收新输入 handleInput(lines); rl.close(); } else { lines.push(line); // 将每一行存储到数组中 } }); function handleInput(inputLines) { for (let i = 0; i < inputLines.length; i++) { const tokens = inputLines[i].split(' '); const sum = parseInt(tokens[0], 10) + parseInt(tokens[1], 10); console.log(sum); // 对每行分别求和并打印结果 } } ``` 在此示例中,程序会持续接受输入直到检测到空行为止,随后调用函数逐行处理数据[^3]。 --- #### 固定行数的输入 如果已知输入总共有 N 行,则可以通过计数器控制循环次数。下面展示了一个针对三行整数相加的操作实例: ```javascript const readline = require('readline'); let count = 0; let results = []; const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', function (line) { if (count >= 3) { // 当达到预设的最大行数时退出 rl.close(); } else { const numbers = line.split(' ').map(Number); results.push(numbers.reduce((a, b) => a + b, 0)); // 计算当前行所有数值之和 count++; } }).on('close', () => { results.forEach(res => console.log(res)); }); ``` 这里设置了最大允许的输入行为三次,每次都将该行中的多个数字累加起来作为最终答案的一部分。 --- #### 总结说明 以上三种情况涵盖了大部分在线评测系统的输入需求。无论是单一还是复杂的多步逻辑都可以借助于 Node.js 自带的 `readline` 库完成高效的数据交互过程[^1]^。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值