• Lintcode解题报告


    1. Num.196 寻找缺失的数

    给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。

     注意事项

    可以改变序列中数的位置。

    样例

    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;
        }
    }
    View Code

    2.Num.570寻找丢失的数II

    给一个由 1 - n 的整数随机组成的一个字符串序列,其中丢失了一个整数,请找到它。

     注意事项

    n <= 30

    样例

    给出 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;
                }
            }
        }
    }
    View Code
  • 相关阅读:
    软件构造 第三章第一节 数据类型与类型检查
    类图总结
    【Beta】Scrum07
    【Beta】用户问题反馈及处理(一直更新)
    【Beta】第七次任务发布
    【Beta】Scrum06
    【Beta】第六次任务发布
    【Beta】Scrum5.5
    【Beta】第5.5次任务发布
    【Beta】Scrum05
  • 原文地址:https://www.cnblogs.com/fisherinbox/p/5922880.html
Copyright © 2020-2023  润新知