Skip to content

Commit 50b5e69

Browse files
committed
Improved solutions.
1 parent 472e208 commit 50b5e69

File tree

8 files changed

+163
-114
lines changed

8 files changed

+163
-114
lines changed
Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,41 @@
11
package g0001_0100.s0001_two_sum
22

3+
import java.util.*
4+
35
class Solution {
4-
fun twoSum(nums: IntArray, target: Int): IntArray {
5-
val res = IntArray(2)
6-
val map = HashMap<Int, Int>()
6+
fun twoSum(nums: IntArray?, target: Int): IntArray {
7+
if (nums == null || nums.size <= 1) {
8+
return IntArray(0)
9+
}
10+
val result = IntArray(2)
11+
var left = 0
12+
var right = nums.size - 1
13+
val nums1 = Arrays.copyOf(nums, nums.size)
14+
Arrays.sort(nums1)
15+
while (left < right) {
16+
if (nums1[left] + nums1[right] == target) {
17+
break
18+
} else if (nums1[left] + nums1[right] > target) {
19+
right--
20+
} else if (nums1[left] + nums1[right] < target) {
21+
left++
22+
}
23+
}
724
for (i in nums.indices) {
8-
val value = target - nums[i]
9-
if (!map.containsKey(value)) {
10-
map[nums[i]] = i
11-
continue
25+
if (nums1[left] == nums[i]) {
26+
result[0] = i
27+
break
1228
}
13-
if (map[value] != i) {
14-
res[1] = i
15-
res[0] = map[value]!!
29+
}
30+
for (j in nums.indices.reversed()) {
31+
if (nums1[right] == nums[j]) {
32+
result[1] = j
1633
break
1734
}
1835
}
19-
return res
36+
val tmp = result[0]
37+
result[0] = Math.min(result[0], result[1])
38+
result[1] = Math.max(tmp, result[1])
39+
return result
2040
}
2141
}

src/main/kotlin/g0001_0100/s0002_add_two_numbers/Solution.kt

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,27 @@
11
package g0001_0100.s0002_add_two_numbers
22

33
/*
4-
* Example:
5-
* var li = ListNode(5)
6-
* var v = li.`val`
74
* Definition for singly-linked list.
8-
* class ListNode(var `val`: Int) {
9-
* var next: ListNode? = null
5+
* public class ListNode {
6+
* int val;
7+
* ListNode next;
8+
* ListNode(int x) { val = x; }
109
* }
1110
*/
1211
class Solution {
1312
fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? {
1413
val dummyHead = ListNode(0)
1514
var p = l1
1615
var q = l2
17-
var curr = dummyHead
16+
var curr: ListNode? = dummyHead
1817
var carry = 0
1918
while (p != null || q != null) {
20-
val x = if ((p != null)) {
21-
p.`val`
22-
} else {
23-
0
24-
}
25-
val y = if ((q != null)) {
26-
q.`val`
27-
} else {
28-
0
29-
}
19+
val x = p?.`val` ?: 0
20+
val y = q?.`val` ?: 0
3021
val sum = carry + x + y
3122
carry = sum / 10
32-
curr.next = ListNode(sum % 10)
33-
curr = curr.next!!
23+
curr!!.next = ListNode(sum % 10)
24+
curr = curr.next
3425
if (p != null) {
3526
p = p.next
3627
}
@@ -39,7 +30,7 @@ class Solution {
3930
}
4031
}
4132
if (carry > 0) {
42-
curr.next = ListNode(carry)
33+
curr!!.next = ListNode(carry)
4334
}
4435
return dummyHead.next
4536
}

src/main/kotlin/g0001_0100/s0003_longest_substring_without_repeating_characters/Solution.kt

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,28 @@ package g0001_0100.s0003_longest_substring_without_repeating_characters
22

33
class Solution {
44
fun lengthOfLongestSubstring(s: String): Int {
5-
var longest = 0
6-
var f = 0
7-
val charArray = IntArray(128)
5+
val lastIndices = IntArray(256)
6+
for (i in 0..255) {
7+
lastIndices[i] = -1
8+
}
9+
var maxLen = 0
10+
var curLen = 0
11+
var start = 0
812
for (i in 0 until s.length) {
9-
if (charArray[s[i].code] == 0) {
10-
longest = if (longest < (i + 1 - f)) (i + 1 - f) else longest
11-
charArray[s[i].code] += 1
13+
val cur = s[i]
14+
if (lastIndices[cur.code] < start) {
15+
lastIndices[cur.code] = i
16+
curLen++
1217
} else {
13-
while (s[f] != s[i]) {
14-
charArray[s[f].code] = 0
15-
f++
16-
}
17-
f++
18+
val lastIndex = lastIndices[cur.code]
19+
start = lastIndex + 1
20+
curLen = i - start + 1
21+
lastIndices[cur.code] = i
22+
}
23+
if (curLen > maxLen) {
24+
maxLen = curLen
1825
}
1926
}
20-
return longest
27+
return maxLen
2128
}
2229
}
Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
package g0001_0100.s0004_median_of_two_sorted_arrays
22

3+
import kotlin.collections.ArrayList
4+
35
class Solution {
46
fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double {
5-
val array = IntArray(nums1.size + nums2.size)
6-
var p = 0
7-
var q = 0
8-
for (i in array.indices) {
9-
if ((p < nums1.size && q < nums2.size && nums1[p] <= nums2[q]) || q == nums2.size) {
10-
array[i] = nums1[p]
11-
p++
12-
} else if ((p < nums1.size && q < nums2.size && nums1[p] > nums2[q]) || p == nums1.size) {
13-
array[i] = nums2[q]
14-
q++
15-
}
7+
val l: MutableList<Int> = ArrayList()
8+
val f: Double
9+
for (j in nums1) {
10+
l.add(j)
11+
}
12+
for (i in nums2) {
13+
l.add(i)
1614
}
17-
return if (array.size % 2 == 0) {
18-
(array[array.size / 2] + array[(array.size / 2) - 1]).toDouble() / 2
15+
l.sort()
16+
val k = l.size
17+
f = if (k % 2 == 0) {
18+
(l[k / 2 - 1] + l[k / 2]).toDouble() / 2
1919
} else {
20-
array[array.size / 2].toDouble()
20+
l[(k + 1) / 2 - 1].toDouble()
2121
}
22+
return f
2223
}
2324
}
25+

src/main/kotlin/g0001_0100/s0005_longest_palindromic_substring/Solution.kt

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,34 @@ package g0001_0100.s0005_longest_palindromic_substring
22

33
class Solution {
44
fun longestPalindrome(s: String): String {
5-
if (s.isEmpty()) {
6-
return s
5+
val newStr = CharArray(s.length * 2 + 1)
6+
newStr[0] = '#'
7+
for (i in s.indices) {
8+
newStr[2 * i + 1] = s[i]
9+
newStr[2 * i + 2] = '#'
710
}
8-
val dp = Array(s.length) { BooleanArray(s.length) }
9-
var longestPalindromeStart = 0
10-
var longestPalindromeLength = 1
11-
for (i in s.length - 1 downTo 0) {
12-
// single character is a palindrome so making it true
13-
dp[i][i] = true
14-
for (j in i + 1 until s.length) {
15-
// checking for two edge cases 1.if characters are equal check for diagonal lower
16-
// left one if true make it true
17-
// 2. or if both equal and its the first elelment in the loop make it as true
18-
if ((s[i] == s[j] && dp[i + 1][j - 1]) || (i + 1 == j && s[i] == s[j])) {
19-
dp[i][j] = true
20-
// update the length if greater than previous
21-
if (j - i + 1 > longestPalindromeLength) {
22-
longestPalindromeLength = j - i + 1
23-
longestPalindromeStart = i
24-
}
25-
}
11+
val dp = IntArray(newStr.size)
12+
var friendCenter = 0
13+
var friendRadius = 0
14+
var lpsCenter = 0
15+
var lpsRadius = 0
16+
for (i in newStr.indices) {
17+
dp[i] = if (friendCenter + friendRadius > i) Math.min(
18+
dp[friendCenter * 2 - i],
19+
friendCenter + friendRadius - i
20+
) else 1
21+
while (i + dp[i] < newStr.size && i - dp[i] >= 0 && newStr[i + dp[i]] == newStr[i - dp[i]]) {
22+
dp[i]++
23+
}
24+
if (friendCenter + friendRadius < i + dp[i]) {
25+
friendCenter = i
26+
friendRadius = dp[i]
27+
}
28+
if (lpsRadius < dp[i]) {
29+
lpsCenter = i
30+
lpsRadius = dp[i]
2631
}
2732
}
28-
// return the substring using starting and ending index
29-
return s.substring(longestPalindromeStart, longestPalindromeStart + longestPalindromeLength)
33+
return s.substring((lpsCenter - lpsRadius + 1) / 2, (lpsCenter + lpsRadius - 1) / 2)
3034
}
31-
}
35+
}

src/main/kotlin/g0001_0100/s0006_zigzag_conversion/Solution.kt

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,31 @@ package g0001_0100.s0006_zigzag_conversion
22

33
class Solution {
44
fun convert(s: String, numRows: Int): String {
5-
if (numRows == 1) return s
6-
val ret = StringBuilder()
7-
val n = s.length
8-
val cycleLen = 2 * numRows - 2
5+
val sLen = s.length
6+
if (numRows == 1) {
7+
return s
8+
}
9+
val maxDist = numRows * 2 - 2
10+
val buf = StringBuilder()
911
for (i in 0 until numRows) {
10-
var j = 0
11-
while (j + i < n) {
12-
ret.append(s[j + i])
13-
if (i != 0 && i != numRows - 1 && j + cycleLen - i < n) {
14-
ret.append(s[j + cycleLen - i])
12+
var index = i
13+
if (i == 0 || i == numRows - 1) {
14+
while (index < sLen) {
15+
buf.append(s[index])
16+
index += maxDist
17+
}
18+
} else {
19+
while (index < sLen) {
20+
buf.append(s[index])
21+
index += maxDist - i * 2
22+
if (index >= sLen) {
23+
break
24+
}
25+
buf.append(s[index])
26+
index += i * 2
1527
}
16-
j += cycleLen
1728
}
1829
}
19-
return ret.toString()
30+
return buf.toString()
2031
}
21-
}
32+
}
Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,41 @@
11
package g0001_0100.s0008_string_to_integer_atoi
22

33
class Solution {
4-
fun myAtoi(str: String): Int {
5-
if (str.trim { it <= ' ' }.isEmpty())
6-
return 0
7-
var localStr = str.trim { it <= ' ' }
4+
fun myAtoi(str: String?): Int {
5+
if (str == null || str.isEmpty()) {
6+
return 0
7+
}
88
var i = 0
9-
var ans = 0
10-
var sign = 1
11-
val len = localStr.length
12-
if (localStr.get(i) == '-' || localStr.get(i) == '+')
13-
sign = if (localStr.get(i++) == '+') 1 else -1
14-
while (i < len)
15-
{
16-
val tmp = localStr.get(i) - '0'
17-
if (tmp < 0 || tmp > 9)
18-
break
19-
if ((ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && Integer.MAX_VALUE % 10 < tmp)))
20-
return if (sign == 1) Integer.MAX_VALUE else Integer.MIN_VALUE
21-
else
22-
ans = ans * 10 + tmp
23-
++i
9+
var negativeSign = false
10+
val input = str.toCharArray()
11+
while (i < input.size && input[i] == ' ') {
12+
i++
13+
}
14+
if (i == input.size) {
15+
return 0
16+
} else if (input[i] == '+') {
17+
i++
18+
} else if (input[i] == '-') {
19+
i++
20+
negativeSign = true
21+
}
22+
var num = 0
23+
while (i < input.size && input[i] <= '9' && input[i] >= '0') {
24+
// current char
25+
var tem = input[i] - '0'
26+
tem = if (negativeSign) -tem else tem
27+
// avoid invalid number like 038
28+
if (num == 0 && tem == '0'.code) {
29+
i++
30+
} else if (num == Int.MIN_VALUE / 10 && tem <= -8 || num < Int.MIN_VALUE / 10) {
31+
return Int.MIN_VALUE
32+
} else if (num == Int.MAX_VALUE / 10 && tem >= 7 || num > Int.MAX_VALUE / 10) {
33+
return Int.MAX_VALUE
34+
} else {
35+
num = num * 10 + tem
36+
i++
37+
}
38+
}
39+
return num
2440
}
25-
return sign * ans
26-
}
27-
}
41+
}

src/test/kotlin/g0001_0100/s0005_longest_palindromic_substring/SolutionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ import org.junit.Test
77
class SolutionTest {
88
@Test
99
fun longestPalindrome() {
10-
assertThat(Solution().longestPalindrome("babad"), equalTo("aba"))
10+
assertThat(Solution().longestPalindrome("babad"), equalTo("bab"))
1111
}
1212
}

0 commit comments

Comments
 (0)