Algorithm:75. 颜色分类
Review: Synchronization and Object Locking
Tip/Tech:快排的非递归实现
Share:爱尔兰青少年因从海洋中去除微塑料而获得谷歌科学奖
Algorithm
75. 颜色分类
https://leetcode-cn.com/problems/sort-colors/
三指针的思想:
设置一个左指针,这个指针只用来标记0的位置,设置右指针,这个指针只用来标记2的位置,那个用来遍历整个数组的指针,只要遍历到0,就和左指针所在的元素进行交换,交换完,左指针向左移动一位;只要遍历到2,就和右指针的所在的元素进行交换,交换完,右指针向右边移动一位。
class Solution {
public void sortColors(int[] nums) {
int left = 0;
int right = nums.length - 1;
int index = 0;
while (index <= right) {
if (nums[index] == 0) {
swap(nums, index, left);
index++;
left++;
} else if (nums[index] == 2) {
swap(nums, index, right);
right--;
} else {
index++;
}
}
}
public void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
Review
Synchronization and Object Locking
https://wiki.openjdk.java.net/display/HotSpot/Synchronization
对象头中有个标记字段,它的最后两位是用来表示对象的锁的状态:
1)00:代表轻量级锁
2)01:代表无锁
3)10:代表重量级锁
4)11:和垃圾回收算法有关
上面的的图展示了是如何对象锁定的,对象头中的最后两位是用来标识对象被上了什么锁的,所以我们一般是用来表示这个对象是否被上锁了,线程也是根据这个来判断对象是否上锁了。
当进行加锁操作时,Java 虚拟机会判断是否已经是重量级锁。如果不是,它会在当前线程的当前栈桢中划出一块空间,作为该锁的锁记录,并且将锁对象的标记字段复制到该锁记录中。
Tip/Tech
快排的非递归实现
因为这个礼拜做了几道题目,所以需要重新用到快排的partition函数,所以重新理解了一下快排,结合一些资料,重新写了快排,单边循环实现partition函数。
private String START_INDEX = "startIndex";
private String END_INDEX = "endIndex";
public void quickSortNoRe(int[] arr, int start, int end) {
Stack<Map<String, Integer>> stack = new Stack<>();
Map<String, Integer> rootParam = new HashMap<>();
rootParam.put(START_INDEX, start);
rootParam.put(END_INDEX, end);
stack.push(rootParam);
while (!stack.isEmpty()) {
Map<String, Integer> tempMap = stack.pop();
int tempStart = tempMap.get(START_INDEX);
int tempEnd = tempMap.get(END_INDEX);
int pivotIndex = partition3(arr, tempStart, tempEnd);
if (tempStart < pivotIndex - 1) {
Map<String, Integer> leftParam = new HashMap<>();
leftParam.put(START_INDEX, start);
leftParam.put(END_INDEX, pivotIndex - 1);
stack.push(leftParam);
}
if (tempEnd > pivotIndex + 1) {
Map<String, Integer> rightParam = new HashMap<>();
rightParam.put(START_INDEX, pivotIndex + 1);
rightParam.put(END_INDEX, end);
stack.push(rightParam);
}
}
}
/**
* 单边循环解决
* @param arr
* @param startIndex
* @param endIndex
* @return
*/
private int partition3(int[] arr, int startIndex, int endIndex) {
int pivotIndex = startIndex;
int pivotValue = arr[startIndex];
for (int i = startIndex + 1; i <= endIndex; ++i) {
if (pivotValue > arr[i]) {
pivotIndex++;
if (pivotIndex != i) {
swap(arr, pivotIndex, i);
}
}
}
swap(arr, startIndex, pivotIndex);
return pivotIndex;
}
Share
Irish Teenager Wins Google Science Award for Removing Microplastics From Oceans
爱尔兰青少年因从海洋中去除微塑料而获得谷歌科学奖
https://www.ecowatch.com/google-science-award-irish-teenager-2639623184.html
首先我们要知道什么是微塑料,这玩意看着名字人畜无害,其实相当的恐怖。
微塑料,是一种直径小于5毫米的塑料颗粒,是一种造成污染的主要载体。微塑料体积小,这就意味着更高的比表面积(比表面积指多孔固体物质单位质量所具有的表面积 ),比表面积越大,吸附的污染物的能力越强。
首先,环境中已经存在大量的多氯联苯、双酚A等持久性有机污染物(这些有机污染物往往是疏水的,就是说它们不太容易溶解在水中,所以它们往往不能随着水流随意流动),一旦微塑料和这些污染物相遇,正好聚集形成一个有机污染球体。微塑料相当于成为污染物的坐骑,二者可以在环境中到处游荡。
因为我们现在对塑料制品大规模的使用,微塑料正在变的越来越多,而且势头有点不可阻挡了,前段时间,已经有科学家在我们的日常饮用水中发现了微塑料,而且,有的体积更小的,会直接进入人体,少量没啥问题,但是量一旦到了一定程度,那么就会危害身体。
这个少年能够解决这个问题,对整个环境是大有益处的,确实,会对人造成影响的,同样也会对动物植物造成不小的影响。
我觉得以后可降解的纸包装会不断的增加,让人们使用塑料的频率大大的减少,我们平时用的塑料袋啊这些,都是很大的塑料的污染来源,现在去药店买药,店员有的都不用塑料包装了都,先都是提供了纸袋,也算是一种趋势吧。