下面所记录的是我在刷 LeetCode Array 相关的题目自己的解法。
13. Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
罗马数字是阿拉伯数字传入之前使用的一种数码。罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:
- 相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
- 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
- 小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9
JavaScript Solution
我的想法就是,首先把所有的数所代表的值都加起来,然后减去小叔子在大数字左边的情况。
在 JavaScript 中,获取第 i 个位置上的 char, 可以使用 s[i]
,也可以使用 s.charAt(1)
;
在 JavaScript 中,判断 String 中是否存在某个String s2
,有 s1.indexOf(s2)
,可以通过返回值是否为 -1 判断,也可以使用s1.includes(s2)
判断 true/false
1 | /** |
Java Solution
在 Java 中,获取第 i 个位置上的 char
,一般使用 s.charAt(i)
在 Java 中,判断一个 String s2
是否出现过,可以使用 s1.indexOf(s2)
,判断值是否为 -1,也可以使用 s1.contains(s2)
,判断 true/false
1 | public int romanToInt(String s) { |
14. Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings.
我的想法就是首先比较前两个,找到最长 prefix,然后用最长 prefix 和数组第三个比较。。。
JavaScript Solution
在 JavaScript 中,获取一个字符串的子串,可以使用以下的方法:
str.slice(beginSlice[, endSlice])
:获得beginSlice
到endSlice
之间的字符串str.substr(start [, length])
:根据 start 和 len 获得字符串str.substring(indexStart[, indexEnd])
:根据 indexStart 和 IndexEnd 获取字符串
其中三者的区别为:
例如:
1 | var strValue = "javascript programing"; |
例如:
1 | var strValue = "javascript programing"; |
1 | /** |
Java Solution
在 JavaScript 中,获取一个字符串的子串,可以使用以下的方法:
1 | substring(int beginIndex) |
1 | public class Solution { |
Best Solution
最优解使用的 String.contains
方法来进行 prefix 的删除,虽然想法一致,但是做法简单得多。
1 | public String longestCommonPrefix(String[] strs) { |
20. Valid Parentheses
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
我的解法是使用栈(Stack)来进行入栈和出栈。
JavaScript Solution
JavaScript 中栈是通过 Array 中 push
、pop
来实现的
1 | /** |
Java Solution
Java 中的栈是通过 Stack
类实现
1 | public boolean isValid(String s) { |
Best Solution
想法基本相同,做法在有些地方有优化
1 | public class Solution { |
28. Implement strStr()
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
虽然这道题直接使用 indexOf 就可以 accept,但是作者的意图应该是让我们实现一个 indexOf 方法。
JavaScript Solution
这个方法是 Best Solution,想法也是一个一个比较,但是在 for 循环中没有设置溢出条件,而是在 if 语句中设置了溢出条件,因为 for 循环中的溢出条件基本用不上。
1 | /** |
Java Solution
1 | public int strStr(String haystack, String needle) { |
38. Count and Say
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
1
is read off as "one 1"
or 11
.11
is read off as "two 1s"
or 21
.21
is read off as "one 2
, then "one 1"
or 1211
.
Given an integer n, generate the nth sequence.
Note: The sequence of integers will be represented as a string.
JavaScript Solution
1 | /** |
Best Solution
如果是针对经常进行变动的 String,可以使用 StringBuilder 类
StringBuilder 类中常用的方法有:
- append
- charAt
- delete(int start, int end)
- deleteCharAt(int index)
- insert(int offset, String str)
- replace(int start, int end, String str)
- substring
String 中常用的方法有:
- charAt
- compareTo
- concat
- contains
- indexOf
- join
- match
- replace
- split
- valueOf
- substring
- toLowerCase/toUpperCase
1 | public class Solution { |
58. Length of Last Word
Given a string s consists of upper/lower-case alphabets and empty space characters ' '
, return the length of last word in the string.
If the last word does not exist, return 0.
Note: A word is defined as a character sequence consists of non-space characters only.
For example,
Given s = "Hello World"
,
return 5
.
JavaScript Solution
1 | /** |
Best Solution
Best Solution 很简单的方法,就是先对 s 进行 trim,将前后的空格都去掉。简化了逻辑中对最后一位是 " "
的判断。
1 | public int lengthOfLastWord(String s) { |
67. Add Binary
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
JavaScript Solution
解决这个问题,有几个要点。第一个要点是 a[i] - "0"
直接获得数字值。第二个要点是,为了不用判断 a 和 b 谁的长度厂,可以在 while
中使用 if
分别处理,尽量避免 a[i]
和 b[j]
的直接联系。第三点是使用 Array 存储,再使用 join
合成 string。
JavaScript string 没有翻转的函数,但是可以使用以下的方法实现该功能:
1 | s.split("").reverse().join(""); |
1 | /** |
Java Solution
1 | public class Solution { |
125. Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,"A man, a plan, a canal: Panama"
is a palindrome."race a car"
is not a palindrome.
Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.
For the purpose of this problem, we define empty string as valid palindrome.
JavaScript Solution
使用正则表达式会很慢
1 | /** |
Best Solution
Best Solution 使用的 char 的函数来比较每个数字,并且有很好的一点是,一个指针从头开始,一个指针从末尾开始,当两个指针相遇时,比较就完成了,时间会比我快一倍。
1 | public class Solution { |
344. Reverse String
Write a function that takes a string as input and returns the string reversed.
Example:
Given s = “hello”, return “olleh”.
JavaScript Solution
这个方法使用的 O(n) 的时间和 O(n) 的额外空间
1 | /** |
Best Solution
最优解法使用的是折半递归处理,时间复杂度为 O(nlog(n)),空间复杂度为 O(log(n))
1 | public String reverseString(String s) { |
345. Reverse Vowels of a String
Write a function that takes a string as input and reverse only the vowels of a string.
Example 1:
Given s = “hello”, return “holle”.
Example 2:
Given s = “leetcode”, return “leotcede”.
Note:
The vowels does not include the letter “y”.
交换所有的元音字母
JavaScript Solution
这个解法使用了 ES6 的数组解构与赋值。
还有一个需要注意的地方是,string 是不可变的,所以 s[i] = s[j]
是不可行的。
1 | /** |
Java Solution
1 | public String reverseVowels(String s) { |
383. Ransom Note
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:
You may assume that both strings contain only lowercase letters.
1 | canConstruct("a", "b") -> false |
JavaScript Solution
我的方法是将 magazine 中所有的字符都放进了一个数组,然后 ransomNote 从中查询,但是查询的时间复杂度是 O(n),所以总体时间复杂度很大。
1 | /** |
Best Solution
Best Solution 的方法把所有的出现都放在一个数组里,减少了每次查询的时间。
1 | public boolean canConstruct(String ransomNote, String magazine) { |
434. Number of Segments in a String
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of non-space characters.
Please note that the string does not contain any non-printable characters.
Example:
1 | Input: "Hello, my name is John" |
JavaScript Solution
1 | /** |
459. Repeated Substring Pattern
Given a non-empty string check if it can be constructed by taking a substring of it and appending multiple copies of the substring together. You may assume the given string consists of lowercase English letters only and its length will not exceed 10000.
Example 1:
1 | Input: "abab" |
Example 2:
1 | Input: "aba" |
Example 3:
1 | Input: "abcabcabcabc" |
JavaScript Solution
从大到小构造 substring 进行判断速度会快很多。
1 | /** |
- The length of the repeating substring must be a divisor of the length of the input string
- Search for all possible divisor of str.length, starting for length/2
- If i is a divisor of length, repeat the substring from 0 to i the number of times i is contained in s.length
- If the repeated substring is equals to the input str return true