找出只出现一次的数字

班级里每位同学都有一张写着整数的卡片。除了一个数字只出现一次,其余数字都恰好出现两次。目标是快速找出这个只出现一次的数字。

这类题可以直接用异或解决:相同数字异或后会抵消,最后剩下的就是只出现一次的数字。

 fn solution(inp: Vec<i32>) -> i32 {
    let mut result = 0;
    for i in inp.iter() {
        result = result ^ i;
    }
    result
} 

统计数字分组中的偶数和组合

给定若干个数字组,每个数字组由 1 到 9 之间的数字组成。需要从每个组里选择一个数字,拼成一个新数,并统计有多少种选择方式能让各位数字之和为偶数。

numbers 是一个整数数组,每个整数可以看作一个数字组。比如 [123, 456, 789] 表示三组数字: 1/2/3 4/5/6 7/8/9

对于 [123, 456, 789] ,符合条件的组合共有 14 个:

147 149 158 167 169 248 257 259 268 347 349 358 367 369

 fn solution(numbers: &[i32]) -> i32 {
  let mut groups = Vec::new();
  for num in numbers.iter() {
      let chats_arr: Vec<i32> = num
          .to_string()
          .chars()
          .map(|c| c.to_digit(10).unwrap() as i32)
          .collect::<Vec<i32>>();
      groups.push(chats_arr);
  }

  fn calc_nums(group: &Vec<Vec<i32>>, index: usize, current_sum: i32, count: &mut i32) {
      if index == group.len() {
          if current_sum % 2 == 0 {
              *count = *count + 1;
          }
          return;
      }
      for &num in group[index].iter() {
          calc_nums(group, index + 1, num + current_sum, count);
      }
  }

  let mut count = 0;
  calc_nums(&mut groups, 0, 0, &mut count);

  return count;
}