题目解析1、2

149 阅读4分钟

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。除了一个数字之外,所有的数字都恰好出现了两次。我们的任务是帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字。

解决方案

为了满足时间复杂度为 O(n) 的要求,并尽量减少额外空间的使用,我们可以使用异或运算。异或运算的性质是:相同的数异或结果为0,不同的数异或结果为1。通过这种方式,我们可以有效地找到那个唯一的数字。

算法步骤

  1. 初始化一个变量 unique 为0。
  2. 遍历 cards 数组中的每一个数字,将其与 unique 进行异或运算。
  3. 最终,unique 的值就是那唯一出现一次的数字。

代码实现

以下是用 Go 语言实现的解决方案:

go
package main  

import "fmt"  

func findUniqueCard(cards []int) int {  
    unique := 0  
    for _, card := range cards {  
        unique ^= card  
    }  
    return unique  
}  

func main() {  
    // 测试样例  
    cards1 := []int{1, 1, 2, 2, 3, 3, 4, 5, 5}  
    fmt.Println(findUniqueCard(cards1)) // 输出:4  

    cards2 := []int{0, 1, 0, 1, 2}  
    fmt.Println(findUniqueCard(cards2)) // 输出:2  

    cards3 := []int{7, 3, 3, 7, 10}  
    fmt.Println(findUniqueCard(cards3)) // 输出:10  
}  

代码详解

  • 初始化:我们创建一个变量 unique,初始值为0。
  • 遍历数组:使用 for 循环遍历 cards 数组中的每一个数字,并将其与 unique 进行异或运算。
  • 返回结果:循环结束后,unique 的值即为我们要找的那个唯一数字。

性能分析

  • 时间复杂度:O(n),其中 n 是 cards 的长度。我们只需遍历一次数组。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

总结

通过使用异或运算,我们不仅有效地找到了唯一的数字,还优化了空间使用。这种方法简单高效,适用于类似的题目。

数字字符串格式化

问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。

解决方案

  1. 去除前导零:我们需要将输入的字符串转换为一个数字,以消除所有前导零。
  2. 分隔整数和小数部分:如果字符串包含小数点,我们需要将整数部分和小数部分分开,便于处理。
  3. 格式化整数部分:在整数部分上添加千分位逗号。
  4. 重新组合:将格式化后的整数部分和小数部分组合起来。

Python代码实现

python
def format_number(s):  
    # 去掉前导零并分离整数部分和小数部分  
    if '.' in s:  
        integer_part, decimal_part = s.split('.')  
    else:  
        integer_part, decimal_part = s, ''  

    # 去掉前导零,整数部分  
    integer_part = str(int(integer_part))  # 转换为整数去掉前导零,再转为字符串  

    # 加入千分位逗号  
    formatted_integer_part = ''  
    while len(integer_part) > 3:  
        formatted_integer_part = ',' + integer_part[-3:] + formatted_integer_part  
        integer_part = integer_part[:-3]  
    formatted_integer_part = integer_part + formatted_integer_part  

    # 合并整数部分和小数部分  
    if decimal_part:  
        return formatted_integer_part + '.' + decimal_part  
    else:  
        return formatted_integer_part  

# 测试样例  
print(format_number("1294512.12412"))  # 输出: '1,294,512.12412'  
print(format_number("0000123456789.99"))  # 输出: '123,456,789.99'  
print(format_number("987654321"))  # 输出: '987,654,321'  

代码详解

  1. if '.' in s: :我们检查字符串是否包含小数点。如果包含,我们用 split('.') 方法将字符串分成整数部分和小数部分。
  2. str(int(integer_part)) :这段代码将整数部分转换为整数,从而去掉任何前导零,然后再次转为字符串。
  3. 千分位格式化:我们通过循环来每次取出最后三位,并在前面添加逗号,直到整数部分被全部处理完。
  4. 输出结果:如果有小数部分,就将格式化的整数部分和小数部分组合在一起返回。

运行测试

运行以上代码段将得到求解的样例输出,确保它符合预期。如果有不同输入,可以通过调用 format_number 函数来测试。这样就能完成小M的需求了。