100天算法入门 - 每日三题 - Day11丢失的数字移动零单词规律

Posted 哪 吒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天算法入门 - 每日三题 - Day11丢失的数字移动零单词规律相关的知识,希望对你有一定的参考价值。

大连跨海大桥夜景


算法是进阶架构师的基础,基础不牢,地动山摇,2021-8-14起开始刷题,目标100天,300道LeetCode算法题,分享是学习的最好方式,加油,嗨起来。

1、LeetCode 268.丢失的数字

题目

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

进阶:

你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?

小编菜解

private static int test01(int[] nums){
    Arrays.sort(nums);

    if (nums[0] != 0){
        return 0;
    }

    if (nums[nums.length-1] != nums.length){
        return nums.length;
    }

    int min = 0;
    int max = nums.length;
    for (int i = 0; i < max; i++) {
        int next = nums[i]+1;
        if (i+1 <max && nums[i+1]!=next){
            return next;
        }
    }
    return -1;
}

2、LeetCode 283.移动零

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

小编菜解

private static void test02(int[] nums){
    int[] temp = new int[nums.length];
    int zeroNum = 0;
    int notZeroNum = 0;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i]!=0){
            temp[notZeroNum] = nums[i];
            notZeroNum++;
        }else{
            temp[nums.length - 1 - zeroNum] = 0;
            zeroNum++;
        }
    }
}

思路及算法

使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。

注意到以下性质:

左指针左边均为非零数;

右指针左边直到左指针处均为零。

因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。

大佬指点江山

public static void moveZeroes(int[] nums) {
    int n = nums.length, left = 0, right = 0;
    while (right < n){
        if (nums[right] != 0){
            swap(nums,left,right);
            left++;
        }
        right++;
    }
}

public static void swap(int[] nums, int left, int right) {
    int temp = nums[left];
    nums[left] = nums[right];
    nums[right] = temp;
}

大佬想的和我想的确实是不一样的。 

3、LeetCode 290.单词规律

题目

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

小编菜解

public static  boolean wordPattern(String pattern, String s) {
    int pl = pattern.length();
    String[] arr = s.split(" ");
    int sl = arr.length;
    if (pl!=sl){
        return false;
    }
    Map<Character, String> map1 = new HashMap<Character, String>();
    Map<String, Character> map2 = new HashMap<String, Character>();
    for (int i = 0; i < pl; i++) {
        if (!map1.containsKey(pattern.charAt(i))){
            if (map2.containsKey(arr[i])){
                return false;
            }
            map1.put(pattern.charAt(i),arr[i]);
            map2.put(arr[i],pattern.charAt(i));
        }else{
            if(!map1.get(pattern.charAt(i)).equals(arr[i])){
                return false;
            }
        }
    }
    return true;
}

大佬指点江山

public boolean wordPattern(String pattern, String str) {
    Map<String, Character> str2ch = new HashMap<String, Character>();
    Map<Character, String> ch2str = new HashMap<Character, String>();
    int m = str.length();
    int i = 0;
    for (int p = 0; p < pattern.length(); ++p) {
        char ch = pattern.charAt(p);
        if (i >= m) {
            return false;
        }
        int j = i;
        while (j < m && str.charAt(j) != ' ') {
            j++;
        }
        String tmp = str.substring(i, j);
        if (str2ch.containsKey(tmp) && str2ch.get(tmp) != ch) {
            return false;
        }
        if (ch2str.containsKey(ch) && !tmp.equals(ch2str.get(ch))) {
            return false;
        }
        str2ch.put(tmp, ch);
        ch2str.put(ch, tmp);
        i = j + 1;
    }
    return i >= m;
}

第一次觉得自己写的比官方给的答案简单,思路居然是一样的,爱了爱了,我还特意在LeetCode提交了自己的答案,哈哈。

推荐阅读

【100天算法入门 - 每日三题 - Day1】二叉树的中序遍历、两数之和、整数反转

【100天算法入门 - 每日三题 - Day2】二分查找、第一个错误的版本、搜索插入位置

【100天算法入门 - 每日三题 - Day3】回文数、罗马数字转数字、最大公共前缀

【100天算法入门 - 每日三题 - Day4】有效的括号、删除有序数组中的重复项、实现strStr

【100天算法入门 - 每日三题 - Day5】最后一个单词的长度、相同的树、买卖股票的最佳时机

【100天算法入门 - 每日三题 - Day6】对称二叉树、二叉树的最大深度、将有序数组转换为二叉搜索树

【100天算法入门 - 每日三题 - Day7】验证回文串、只出现一次的数字、多数元素

【100天算法入门 - 每日三题 - Day8】同构字符串、存在重复元素、翻转二叉树

【100天算法入门 - 每日三题 - Day9】汇总区间、2的幂、有效的字母异位词

【100天算法入门 - 每日三题 - Day10】二叉树的所有路径、各位相加、丑数 

以上是关于100天算法入门 - 每日三题 - Day11丢失的数字移动零单词规律的主要内容,如果未能解决你的问题,请参考以下文章

100天算法入门 - 每日三题 - Day15判断子序列最长回文数Fizz Buzz

100天算法入门 - 每日三题 - Day5最后一个单词的长度相同的树买卖股票的最佳时机

100天算法入门 - 每日三题 - Day16第三大的数字符串中的单词数排列硬币

100天算法入门 - 每日三题 - Day10二叉树的所有路径各位相加丑数

100天算法入门 - 每日三题 - Day13反转字符串反转字符串中的元音字母两个数组的交集

100天算法入门 - 每日三题 - Day17找到所有数组中消失的数最小操作次数使数组元素相等分发饼干