Algorithm
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
我的解法:
public static int removeElement(int[] nums, int val) {
int index = 0;
for (int i = 0; i < nums.length; i++) {
if(val != nums[i]){
nums[index] = nums[i];
index++;
}
}
return index;
}
Review
The Role of IT or an IT Consultant Provider for Business Growth
本文简而言之就是介绍IT在企业发展中能起到的作用。
Tip
近期刚好在看Java锁有关的知识,以下是有关锁分类与其概念的一些理解。
- 公平锁:多个线程按顺序获取锁,先到先得
- 非公平锁:多个线程不保障按顺序获取锁,来得早不如来得巧
例:A获取到锁,此时B、C到来,锁被占用,进入入等待队列;此时D来获取锁,刚好此时A释放锁
公平锁:先判断等待队列是否为空或者自己是否位于队列头部,满足条件则D获得锁。非公平锁:D获得锁
- 独享锁/互斥锁:同时只能有一个线程获得锁。如:ReentrantLock,ReadWriteLock中的写锁
- 共享锁:同时可以有多个线程获得锁。如:CountDownLatch,ReadWriteLock 中的读锁
- 乐观锁:认为在它修改之前,没有其它线程去修改它,不去上锁;但在更新前会判断在此期间数据是否有更新,常用CAS算法.适用于多读的应用场景
- 悲观锁:每次取数据都认为别人会修改,所以每次都上锁,适用于多写操作
- 可重入锁:也叫做递归锁,线程可以进入任何一个它已经拥有的锁所同步着的代码块。如:ReentrantLock,Synchronized
- 分段锁:细化锁的粒度,减少锁的持有时间、降低锁的请求频率。如::ConcurrentHashMap
- 自旋锁:当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。
Share
推荐一个学习数据结构与算法的有趣网站。它通过动画演示一些数据结构与算法,不仅支持暂停、单步、回退等功能,演示算法的时候,还可查看算法代码的执行过程。
点击访问: VisuAlgo