写点什么

第四周 ARTS 打卡

作者:犇犇
  • 2023-09-10
    北京
  • 本文字数:2599 字

    阅读完需:约 9 分钟

1、Algorithm

找出数组中重复的数字。参考:https://blog.csdn.net/YouMing_Li/article/details/114226853

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

限制:2 < = n < = 100000

解法一:建立一个新数组打卡标记所有数字都在 0 ~ n - 1 之间,所以可以建立一个长度为 n 的辅助数组 temp,将原数组中元素的数值作为 temp 数组的下标索引值进行计数,用来记录每个数字出现了多少次。遍历数组 temp,当前元素大于 1 的话,说明出现次数大于 1,即重复了,返回该元素的索引即可,因为索引对应的就是原数组中的元素值。

时间复杂度: 遍历数组 O(n)

空间复杂度: 开辟了大小为 n 的辅助数组 O(n)


class Solution {    public int findRepeatNumber(int[] nums) {        //检查参数合法性        if(nums == null || nums.length == 0) return -1;         //数组中有数字不在0~n-1范围内时不符合题意,直接返回-1        for(int i = 0;i < nums.length;i++){            if(nums[i] < 0 || nums[i]>nums.length-1) return -1;        }
        int[] temp = new int[nums.length];//声明数组用于标记nums数组中每个数字出现的次数
        for(int i = 0; i < nums.length; i++){            temp[nums[i]]++;        }
        for(int i = 0; i < temp.length; i++){            if(temp[i] > 1){//次数大于1,i就是重复的                return i;//注意返回的是i,temp[i]是出现的次数,i才是重复的数字            }        }
        return -1;//没有重复的数字    }}
复制代码


解法二:移动元素让下标和值相对应将每个元素放到与下标对应的地方,如 2 应该放在 nums[2]的位置,如果下标 0 的位置是 2,则不满足 nums[0] = 0,而是应该将下标 0 处的元素 2 放到 nums[2]的位置,而如果经过比较发现 nums[2]的位置本身就是 2 了,说明 2 就是重复的数字。

时间复杂度: 遍历数组 O(n)

空间复杂度: 并未开辟额外空间 O(1)

class Solution {    public int findRepeatNumber(int[] nums) {        //检查参数的合法性        if(nums == null || nums.length == 0) return -1;                for(int i = 0; i < nums.length; i++){            while(nums[i] != i){ //注意这里是while,而不是if,因为换回来的数字,也要放到正确的位置去                if(nums[i] == nums[nums[i]]){//nums[i]应该放到下标为nums[i]的位置的                    return nums[i];                }                //不相等,则交换,将nums[i]放到与下标对应的位置去                int temp = nums[nums[i]];                nums[nums[i]] = nums[i];                nums[i] = temp;            }        }        return -1;    }}
复制代码


解法三:将数组排序,判断相邻两个数是否相等

时间复杂度: 用到快速排序 O(nlogn)

class Solution {    public int findRepeatNumber(int[] nums) {        //检查参数合法性        if(nums == null || nums.length == 0) return -1;        Arrays.sort(nums);//将数组排序,默认快排        for(int i = 0; i < nums.length; i++){            if(i !=0 && nums[i] == nums[i-1] ){//当前数字和前一个数字相同                return nums[i];            }        }        return -1;    }}
复制代码

解法四:利用 HashSet 记录,出现重复数字时立马返回结果即可

class Solution {    public int findRepeatNumber(int[] nums) {        //检查参数合法性        if(nums == null || nums.length == 0) return -1;         Set<Integer> set = new HashSet<>();         for(int i = 0; i < nums.length;i++){             if(set.contains(nums[i])){                 return nums[i]; //该数字已经存在于set中,重复了             } else {                 set.add(nums[i]);//该数字不在set中,添加进去             }         }         return -1;    }}
复制代码

2、Review:

https://developer.android.google.cn/topic/performance/vitals/launch-time

官网介绍的关于应用启动时间的内容。首先介绍启动过程的内部机制。然后,讨论如何分析启动性能。最后,介绍一些常见的启动时间问题,并给出一些有关如何解决这些问题的提示。


3、Tips:

Android 在线源码网站推荐:

  • http://androidxref.com/。这个网站提供了从 Android 1.6 到 9.0 的源码,虽然源码版本比较老,但是查询搜索功能很齐全,如果想了解老版本的源码,这个网站是个不错的选择。

  • http://aospxref.com。这个网站提供了从 Android 7 到最新的 13 的源码,源码很新,但是过早的源码没有,可以结合其他的网站使用。但需要注意的是,网站页面布局不是很好看,浏览器可能没有完全适配,部分源码有遮挡现象。

  • https://www.androidos.net.cn/sourcecode。这个网站包含了 Android 和 Linux 内核的源码,地址是 https://www.androidos.net.cn/sourcecode。

  • https://cs.android.com/android/platform/superproject。这个网站包含了 Android 源码从 2.2 到 13 的内容,非常全面,而且很清晰,不仅可以查看 Android 源码,AndroidX、Kernel 等系列源码都可以查看。

  • https://android.googlesource.com/platform。这个网站包含了 Android 源码从 1.6 到 13 的内容,它是 Google Git,可以查看历史所有版本和修改记录,以及各个版本分支和 tag 是最新版的源码库。需要注意的是,这个网站需要梯子才能上去。


4、Share:

https://www.sohu.com/a/703586673_115128

10 倍效率的开发者即将消亡 

这篇文章是作者对于 10 倍效率的开发者这一概念的批判和反思。作者认为,这种概念是基于错误的假设和测量方法,导致了一些不良的后果,比如过度依赖个人英雄主义,忽视团队合作,以及缺乏对软件质量和可维护性的关注。作者提出了一些替代的观点和建议,比如重视软件工程的原则和实践,培养团队的信任和协作,以及使用更合理的评估标准和工具。作者预测,随着软件行业的发展和变化,10 倍效率的开发者这一神话将会逐渐消失,取而代之的是更加专业和平衡的开发者。

发布于: 刚刚阅读数: 5
用户头像

犇犇

关注

还未添加个人签名 2017-11-23 加入

还未添加个人简介

评论

发布
暂无评论
第四周ARTS打卡_ARTS 打卡计划_犇犇_InfoQ写作社区