Skip to content

Commit 5e2f432

Browse files
Merge pull request youngyangyang04#1512 from destroyerngu/master
添加0034 Kotlin版,0203 Kotlin版,0209 Koltin版, 0977 Kotlin版
2 parents 8cb165e + 8a8217d commit 5e2f432

5 files changed

+172
-0
lines changed

problems/0034.在排序数组中查找元素的第一个和最后一个位置.md

+43
Original file line numberDiff line numberDiff line change
@@ -584,5 +584,48 @@ object Solution {
584584
```
585585

586586

587+
### Kotlin
588+
```kotlin
589+
class Solution {
590+
fun searchRange(nums: IntArray, target: Int): IntArray {
591+
var index = binarySearch(nums, target)
592+
// 没找到,返回[-1, -1]
593+
if (index == -1) return intArrayOf(-1, -1)
594+
var left = index
595+
var right = index
596+
// 寻找左边界
597+
while (left - 1 >=0 && nums[left - 1] == target){
598+
left--
599+
}
600+
// 寻找右边界
601+
while (right + 1 <nums.size && nums[right + 1] == target){
602+
right++
603+
}
604+
return intArrayOf(left, right)
605+
}
606+
// 二分查找常规写法
607+
fun binarySearch(nums: IntArray, target: Int): Int {
608+
var left = 0;
609+
var right = nums.size - 1
610+
while (left <= right) {
611+
var middle = left + (right - left)/2
612+
if (nums[middle] > target) {
613+
right = middle - 1
614+
}
615+
else {
616+
if (nums[middle] < target) {
617+
left = middle + 1
618+
}
619+
else {
620+
return middle
621+
}
622+
}
623+
}
624+
// 没找到,返回-1
625+
return -1
626+
}
627+
}
628+
```
629+
587630
-----------------------
588631
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0203.移除链表元素.md

+34
Original file line numberDiff line numberDiff line change
@@ -534,5 +534,39 @@ object Solution {
534534
}
535535
}
536536
```
537+
Kotlin:
538+
```kotlin
539+
/**
540+
* Example:
541+
* var li = ListNode(5)
542+
* var v = li.`val`
543+
* Definition for singly-linked list.
544+
* class ListNode(var `val`: Int) {
545+
* var next: ListNode? = null
546+
* }
547+
*/
548+
class Solution {
549+
fun removeElements(head: ListNode?, `val`: Int): ListNode? {
550+
// 使用虚拟节点,令该节点指向head
551+
var dummyNode = ListNode(-1)
552+
dummyNode.next = head
553+
// 使用cur遍历链表各个节点
554+
var cur = dummyNode
555+
// 判断下个节点是否为空
556+
while (cur.next != null) {
557+
// 符合条件,移除节点
558+
if (cur.next.`val` == `val`) {
559+
cur.next = cur.next.next
560+
}
561+
// 不符合条件,遍历下一节点
562+
else {
563+
cur = cur.next
564+
}
565+
}
566+
// 注意:返回的不是虚拟节点
567+
return dummyNode.next
568+
}
569+
}
570+
```
537571
-----------------------
538572
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0206.翻转链表.md

+35
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,41 @@ fun reverseList(head: ListNode?): ListNode? {
420420
return pre
421421
}
422422
```
423+
```kotlin
424+
/**
425+
* Example:
426+
* var li = ListNode(5)
427+
* var v = li.`val`
428+
* Definition for singly-linked list.
429+
* class ListNode(var `val`: Int) {
430+
* var next: ListNode? = null
431+
* }
432+
*/
433+
class Solution {
434+
fun reverseList(head: ListNode?): ListNode? {
435+
// temp用来存储临时的节点
436+
var temp: ListNode?
437+
// cur用来遍历链表
438+
var cur: ListNode? = head
439+
// pre用来作为链表反转的工具
440+
// pre是比pre前一位的节点
441+
var pre: ListNode? = null
442+
while (cur != null) {
443+
// 临时存储原本cur的下一个节点
444+
temp = cur.next
445+
// 使cur下一节点地址为它之前的
446+
cur.next = pre
447+
// 之后随着cur的遍历移动pre
448+
pre = cur;
449+
// 移动cur遍历链表各个节点
450+
cur = temp;
451+
}
452+
// 由于开头使用pre为null,所以cur等于链表本身长度+1,
453+
// 此时pre在cur前一位,所以此时pre为头节点
454+
return pre;
455+
}
456+
}
457+
```
423458

424459
Swift:
425460
```swift

problems/0209.长度最小的子数组.md

+32
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,38 @@ class Solution {
417417
}
418418
}
419419
```
420+
滑动窗口
421+
```kotlin
422+
class Solution {
423+
fun minSubArrayLen(target: Int, nums: IntArray): Int {
424+
// 左边界 和 右边界
425+
var left: Int = 0
426+
var right: Int = 0
427+
// sum 用来记录和
428+
var sum: Int = 0
429+
// result记录一个固定值,便于判断是否存在的这样的数组
430+
var result: Int = Int.MAX_VALUE
431+
// subLenth记录长度
432+
var subLength = Int.MAX_VALUE
433+
434+
435+
while (right < nums.size) {
436+
// 从数组首元素开始逐次求和
437+
sum += nums[right++]
438+
// 判断
439+
while (sum >= target) {
440+
var temp = right - left
441+
// 每次和上一次比较求出最小数组长度
442+
subLength = if (subLength > temp) temp else subLength
443+
// sum减少,左边界右移
444+
sum -= nums[left++]
445+
}
446+
}
447+
// 如果subLength为初始值,则说明长度为0,否则返回subLength
448+
return if(subLength == result) 0 else subLength
449+
}
450+
}
451+
```
420452
Scala:
421453

422454
滑动窗口:

problems/0977.有序数组的平方.md

+28
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,8 @@ class Solution {
363363
```
364364

365365
Kotlin:
366+
367+
双指针法
366368
```kotlin
367369
class Solution {
368370
// 双指针法
@@ -384,6 +386,32 @@ class Solution {
384386
}
385387
}
386388
```
389+
骚操作(暴力思路)
390+
```kotlin
391+
class Solution {
392+
fun sortedSquares(nums: IntArray): IntArray {
393+
// left 与 right 用来控制循环,类似于滑动窗口
394+
var left: Int = 0;
395+
var right: Int = nums.size - 1;
396+
// 将每个数字的平方经过排序后加入result数值
397+
var result: IntArray = IntArray(nums.size);
398+
var k: Int = nums.size - 1;
399+
while (left <= right) {
400+
// 从大到小,从后向前填满数组
401+
// [left, right] 控制循环
402+
if (nums[left] * nums[left] > nums[right] * nums[right]) {
403+
result[k--] = nums[left] * nums[left]
404+
left++
405+
}
406+
else {
407+
result[k--] = nums[right] * nums[right]
408+
right--
409+
}
410+
}
411+
return result
412+
}
413+
}
414+
```
387415

388416
Scala:
389417

0 commit comments

Comments
 (0)