第三周 ARTS 打卡
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
保罗·格雷厄姆在本文中探讨了在各个领域取得卓越成就的技巧,试图找到这些技巧的交集。文章提出了做大事的四个步骤:
选择一个领域、学习知识前沿、注意前沿知识的空白点,然后探索有潜力的领域。文章强调了努力工作的重要性,并鼓励对自己感兴趣的事物保持好奇心和激情。
版权声明: 本文为 InfoQ 作者【犇犇】的原创文章。
原文链接:【http://xie.infoq.cn/article/204b355fb19aa3e8d74b289c1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论