写点什么

第三周 ARTS 打卡

作者:犇犇
  • 2023-09-04
    北京
  • 本文字数:2159 字

    阅读完需:约 7 分钟

1、Algorithm

数组中出现次数超过一半的数字

解法 1: HashMap 计数

import java.util.*;

public class Solution {

    public int MoreThanHalfNum_Solution(int [] array) {

        // 定义一个 map 保存数组中各个元素出现的次数

        HashMap<Integer,Integer> map = new HashMap<>();

        int n = array.length;

        for(int i = 0;i < n;i++){

            // 如果 map 中已经包含了这个数字就将该数字的次数+1

            if(map.containsKey(array[i])){

                map.put(array[i],map.get(array[i]) + 1);

            }else{

                // 如果 map 中没有包含了这个数字保存并次数是 1

                map.put(array[i],1);

            }

        }

        // 遍历数组找到出现次数超过一半的次数

        for(int i = 0;i < n;i++){

            if(map.get(array[i]) > n/2){

                return array[i];

            }

        }

        return 0;

    }

}


解法二:先排序后找

import java.util.*;


public class Solution {

    public int MoreThanHalfNum_Solution(int [] array) {

        if(array == null || array.length == 0){

            return 0;

        }

        // 将数组进行排序,如果有出现次数超过一半的数字一定是在数组的中间

        Arrays.sort(array);

        int num = array[array.length / 2];

        int count = 0;

        // 排序后数组中间的数字出现的次数

        for(int i = 0;i < array.length;i++){

            if(array[i] == num){

                count++;

            }

        }

        if(count > array.length / 2){

            return num;

        }else{

            return 0;

        }

    }

}

解法三:抵消法

public class Solution {

    public int MoreThanHalfNum_Solution(int [] array) {

        if(array.length == 0 || array == null){

            return 0;

        }

        int target = array[0];

        int times = 1;//当前元素出现的次数

        for(int i = 1;i < array.length;i++){

            // 如果 times==0 说明 i 之前的元素全部抵消了,就定义新的可能出现次数超过一半的元素等于 target

            if(times == 0){

                target = array[i];

                times = 1;

            }else if(target == array[i]){

                // 如果当前元素的值等于 target 就让他出现的次数+1

                times++;

            }else{

                // 如果当前元素的值不等于 target 就让他出现的次数-1

                times--;

            }

        }

        // 让不相等的两个元素相互抵消,最终 target 指向的元素就是出现次数超过一半的元素

        // 统计 target 出现的次数

        int count = 0;

        for(int i = 0;i < array.length;i++){

            if(target == array[i]){

                count++;

            }

        }

        if(count > array.length/2){

            return target;

        }else{

            return 0;

        }

    }

}


2、Review

https://docs.gradle.org/current/userguide/gradle_wrapper.html

一篇介绍 Gradle Wrapper 的官方文档。Gradle Wrapper 是启动 Gradle 构建的首选方法。包装器在 Windows 上是一个批处理脚本,而在其他操作系统上是个 shell 脚本。当通过包装器启动 Gradle 构建时,将自动下载 Gradle 并用于运行构建。


3、Tips

关于 sharedUserId 问题:

签名安装出错。adb: failed to install /Users/admin/Documents/***/build/outputs/apk/debug/signer/xxxApp-debug.apk: Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: Reconciliation failed...: Reconcile failed: Package xxx.app has no signatures that match those in shared user android.uid.system; ignoring!]

是因为我在 manifest.xml 里面加了 sharedUserId="android.uid.system" 加这句的原因是因为应用用到了系统权限,所以需要系统打包,这样装到手机上之后 ,就成了系统应用,即使在内存不足的时候也不会被系统 kill 掉 ,但是系统打包是需要进行系统签名 而不是直接通过 AndroidStudio 就可以运行到手机上的。

参考链接:

https://blog.csdn.net/duguodong2588/article/details/100057709

https://blog.csdn.net/tw19811220/article/details/9073755


4、Share

硅谷创业教父保罗·格雷厄姆(Paul Graham):如何做成大事(Great work)

https://mp.weixin.qq.com/s/C-UACKZ2ecZXp45JZS4PpA

保罗·格雷厄姆在本文中探讨了在各个领域取得卓越成就的技巧,试图找到这些技巧的交集。文章提出了做大事的四个步骤:

选择一个领域、学习知识前沿、注意前沿知识的空白点,然后探索有潜力的领域。文章强调了努力工作的重要性,并鼓励对自己感兴趣的事物保持好奇心和激情。

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

犇犇

关注

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

还未添加个人简介

评论

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