Algorithm:560. 和为K的子数组;525. 连续数组
Review:
Tip/Tech:
Share:
Algorithm
560. 和为K的子数组
把到每个位置的总和给记录下来,如果有两个位置的sum的差为K就表示,这两个位置之间的和为K。用个哈希表存储,key为sum,value是sum出现的次数,也就是每个起点的数量,我们先来看一下代码:
public static int subarraySumBetter(int[] nums, int k) {
HashMap<Integer, Integer> map = new HashMap<>();int result = 0;int sum = 0;map.put(0, 1);for (int i = 0; i < nums.length; i++) {
sum += nums[i];if(map.containsKey(sum-k))result += map.get(sum-k);// result += map.getOrDefault(sum - k, 0);int t = map.getOrDefault(sum, 0) + 1;map.put(sum, t);}return result;
}
public static void main(String[] args) {
int[] test1 = {
1,1,1,1,1,1,1,0,1,1};System.out.println(subarraySumBetter(test1, 3));
}
用下面的这个图来表示一下,看看各个变量的数据变化:
525. 连续数组
这里的主要的思想就是哈希思想,用一个sum来进行标识每个位置的值,sum遇到『0』 减一,遇到『1』加一;这样只要有两个位置的sum的值想通,就表示,两个位置之间的『0,1』的数量相同。
public int findMaxLength(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();int sum = 0;int res = 0;map.put(0, -1);for (int i = 0, len = nums.length; i < len; ++i) {
if (nums[i] == 0) {
sum--;} else {
sum ++;}if (map.containsKey(sum)) {
res = Math.max(res, i - map.get(sum));} else {
map.put(sum, i);}}return res;
}
Review
https://97-things-every-x-should-know.gitbooks.io/97-things-every-programmer-should-know/content/en/thing_01
Act with Prudence 谨慎行事
我们的日常开发都要遇到两个问题,要么是『doing it right』,要么是 『doing it quick』,但是因为现在开发的时间紧张,所以我们都回自然而然的选择后者,做得快,那么就会不免的留下了『Technical debt 』技术债务,
啥是技术债务?就相当于贷款,你可以靠着这个贷款解决手头紧的问题,但是在贷款后,你以后偿还就要还利息咯。那么映射到我们的技术上,就是如果我们因为选择了速度,而没有注重质量导致的日后的代码重构和添加新的功能变的很困难。
事实上,通常只有当事情变得非常糟糕以至于你必须修复它时,你才真正回去修复它。
作者提出的做法就是,如果你不得不因为速度而放弃了质量,那么你就要把这些问题给记录下来,用于日后尽快的偿还。
你必须要尽快的偿还债务才算明智。
Tip/Tech
学习了一些位运算的操作,做了两道题。
常见的操作:
n & n - 1
// 位1的个数
int res = 0;
while(n != 0) {
res++;n = n & (n - 1);
}
return res;
Share
https://www.weforum.org/agenda/2019/04/south-korea-recycling-food-waste/
韩国现在可回收95%的食物垃圾
韩国一度只能回收2%的食物垃圾,但是现在达到了95%。
在韩国,你扔掉食物的垃圾是需要支付费用的,也就是说你如果扔了食物越多,那么你需要支付的费用就越高昂。
这种需要支付费用邮寄的做法,就鼓励了每家每户各种用去了水分来减少费用。
政府正在计划用城市农场,这样每家每户就可以用食物垃圾的堆肥来帮助农场的作物生长。