260. Single Number III

解决单例数问题的算法:给定一个整数数组,找出仅出现一次的两个数,要求时间复杂度为O(n),空间复杂度为O(1)。核心思路是异或操作找到唯一值,再按位分组。

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

260. Single Number III

Medium

3945186Add to ListShare

Given an integer array nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once. You can return the answer in any order.

You must write an algorithm that runs in linear runtime complexity and uses only constant extra space.

Example 1:

Input: nums = [1,2,1,3,2,5]
Output: [3,5]
Explanation:  [5, 3] is also a valid answer.

Example 2:

Input: nums = [-1,0]
Output: [-1,0]

Example 3:

Input: nums = [0,1]
Output: [1,0]

Constraints:

  • 2 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • Each integer in nums will appear twice, only two integers will appear once.

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        """
        sorted(Solution().singleNumber([1, 2, 1, 3, 2, 5])) == [3, 5]
        
        参考别人的解题思路:假设a,b为单独的2个数,对nums所有数进行异或,可以得到 d=a^b 的值

        方法1:找到d中第一个二进制位为1的位数k,再次对nums数组的数在位数k为1或者为0进行分组,a,b肯定落在单独的一边
        int k = 0;
        while(!(sum >> k & 1)) k++;
        if(x >> k & 1)

        采用方法2:d &(-d), 可以找到最低位为1的数,接着同方法1分组
        时间复杂度:O(n) 空间复杂度:O(1)

        如 a=3,b=5 d=a^b=6  d &(-d)= 2 可以找到最低位为1的数
        正数转负数 总结过程:          6 = 0 110 (原码)
        a.最高位改成1                1 110 负数二进制表示
        b.除了最高位,其他位取反       1 001
        c.结果+1                   1 010
        d.得到的结果就是对应的负值     -6 = 1 010  负数在机器中以补码形式保存
        负数转正数反之
        """

        d = 0
        for i in nums:
            d ^= i
        # 找到最低位为1的数
        d &= -d
        result = [0, 0]
        for i in nums:
            if i & d == 0:
                result[0] ^= i
            else:
                result[1] ^= i
        return result

### C# `Convert.ToSingle` 方法使用说明 #### 方法概述 `Convert.ToSingle` 是 .NET Framework 提供的一个静态方法,用于将指定类型的数值转换为单精度浮点数 (`float`)。此方法能够处理多种输入类型并返回相应的 `float` 值。 #### 参数与返回值 该方法接受一个参数,通常是一个实现了 `IConvertible` 接口的类型实例,如整数、字符串或其他数值类型,并尝试将其转换成 `float` 类型[^2]。 #### 使用示例 以下是几个常见的使用场景: ```csharp // 整数转浮点数 int intValue = 10; float resultFloatFromInt = Convert.ToSingle(intValue); Console.WriteLine($"Integer to Float: {resultFloatFromInt}"); // 输出 Integer to Float: 10.0 // 字符串转浮点数 string stringValue = "123.45"; float resultFloatFromString = Convert.ToSingle(stringValue); Console.WriteLine($"String to Float: {resultFloatFromString}"); // 输出 String to Float: 123.45 ``` #### 特殊情况处理 当遇到无法解析的数据时,`Convert.ToSingle` 可能会抛出异常。对于可能包含无效字符或格式错误的字符串,在执行转换前应先验证数据的有效性。 #### 注意事项 - 对于超出范围的情况(即源值太大或太小),可能会得到正负无穷大或者零的结果。 - 如果传入的是 `null` 或者空字符串,则默认返回零(`0.0f`)。 - 当处理来自用户的输入或者其他不可信来源的数据时,建议捕获潜在的异常以防止程序崩溃。 #### 错误处理示范 为了更安全地使用 `Convert.ToSingle`,可以在实际项目中加入异常捕捉机制来应对可能出现的问题: ```csharp try { string userInput = Console.ReadLine(); float convertedNumber = Convert.ToSingle(userInput); Console.WriteLine($"Converted number is :{convertedNumber}"); } catch (FormatException ex){ Console.WriteLine("The input format was not correct."); } catch (OverflowException ox){ Console.WriteLine("The value provided cannot be represented as a single precision floating point number."); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值