1. Num.196 寻找缺失的数
给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。
注意事项
可以改变序列中数的位置。
样例
View Code
N = 4
且序列为 [0, 1, 3]
时,缺失的数为2
。
1.可以1~n-1求和再减去数组中数字的总和,差值即为缺失的数,但是容易造成溢出.
2.利用异或的性质
K^k = 0;
0^k = k;
将所有数两两异或则丢失的那个数就会是异或的结果
public class Solution { /** * @param nums: an array of integers * @return: an integer */ public int findMissing(int[] nums) { // write your code here if (nums == null || nums.length == 0) { return 0; } int ans = 0; for (int i = 0; i < nums.length; i++) { ans = ans ^ nums[i] ^ i; } ans = ans ^ (nums.length); return ans; } }
2.Num.570寻找丢失的数II
给一个由 1 - n
的整数随机组成的一个字符串序列,其中丢失了一个整数,请找到它。
注意事项
n <= 30
样例
View Code
给出 n = 20
, str = 19201234567891011121314151618
丢失的数是 17
,返回这个数。
思路:难点在于给的是字符串而不是数组,对于字符串中的连续两个字符,需要判断是一个数字还是两个数字
看到标签深度优先搜索才想到用深度优先搜索。
注意特殊情况 num==0和找到之后不能再继续找下去,所以
ans!=0的时候就直接break
public class Solution { /** * @param n an integer * @param str a string with number from 1-n * in random order and miss one number * @return an integer */ int ans; public int findMissing2(int n, String str) { // Write your code here if (str == null || str.length() == 0) { return n; } boolean[] flag = new boolean[n + 1]; findHelper(flag, n, 0, 0, str); return ans; } public void findHelper(boolean[] flag, int n,int sum, int index, String str) { if (index == str.length()) { ans = (n + 1) * n / 2 - sum; return; } //连续的两位字符,判断哪个满足条件 for (int i = 1; i <= 2; i++) { int num = Integer.parseInt(str.substring(index, index + i)); if (num == 0) { break; } if (num <= n && !flag[num]) { flag[num] = true; findHelper(flag, n, sum + num, index + 1 + i - 1, str); flag[num] = false; } //在最后一个字符位置就不需要遍历两字符的情况了 + 找到之后就不需要继续找 if (index == str.length() - 1 || ans != 0) { break; } } } }