題目:實現StrStr() 執行用時: 4 ms,
實現 strStr() 函數。
給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle
字符串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。
示例 1:
輸入: haystack = "hello", needle = "ll"
輸出: 2
示例 2:
輸入: haystack = "aaaaa", needle = "bba"
輸出: -1
說明:
當 needle 是空字符串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。
對於本題而言,當 needle 是空字符串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。
public int strStr(String haystack, String needle) {
int h_length=haystack.length();
int n_length = needle.length();
if( h_length==0 && n_length!=0) return -1;
if(h_length==0 && n_length==0) return 0;
char[] h = haystack.toCharArray();
char[] n = needle.toCharArray();
String s2 = new String(n);
for(int i=0;i<h_length-n_length+1;i++){
//如果這裏不加1的話 "a" "a" 這種就通過不了
String s1 = new String(h,i,n_length);
//從h 字符數組中獲取從i開始長度爲n_length 的字符
if(s1.equals(s2)) return i;
}
return -1;
}
註釋:
indexOf() 方法有以下四種形式:
public int indexOf(int ch):
返回指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
public int indexOf(int ch, int fromIndex):
返回從 fromIndex 位置開始查找指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
int indexOf(String str):
返回指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
int indexOf(String str, int fromIndex):
返回從 fromIndex 位置開始查找指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
題目:移除元素 https://leetcode-cn.com/problems/remove-element/solution/
給定一個數組 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。
注意這五個元素可爲任意順序。
你不需要考慮數組中超出新長度後面的元素。
說明:
爲什麼返回數值是整數,但輸出的答案是數組呢?
請注意,輸入數組是以“引用”方式傳遞的,這意味着在函數裏修改輸入數組對於調用者是可見的。
你可以想象內部操作如下:
// nums 是以“引用”方式傳遞的。也就是說,不對實參作任何拷貝
int len = removeElement(nums, val);
// 在函數裏修改輸入數組對於調用者是可見的。
// 根據你的函數返回的長度, 它會打印出數組中該長度範圍內的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
注意啦:原定位置移數,題目理解錯誤做法還沒提交成功
public int removeElement(int[] nums, int val) {
//先排序 然後把值提到後面去 然後倒轉-數
Arrays.sort(nums);
int temp,j=nums.length-1,len =nums.length ;
while(nums[j] == val) j--;
for(int i=0;i<nums.length;i++){
if(nums[i] == val) {
temp = nums[i];
nums[i] = nums[j];
nums[j--] = temp;
}
}
for(int i=0;i<nums.length;i++){
if(nums[i] == val) len--;
}
return len;
}
法一:雙指針 5ms 與刪除排序數組中的重複項方法一樣
https://leetcode-cn.com/articles/remove-duplicates-from-sorted-array/
public int removeElement(int[] nums, int val) {
int i= 0;
for(int j=0;j<nums.length;j++){
if(nums[j] != val){
nums[i] = nums[j];
i++;
}
}
return i;
}
法二: 6 ms
當我們遇到 nums[i] = valnums[i]=val 時,我們可以將當前元素與最後一個元素進行交換,
並釋放最後一個元素。這實際上使數組的大小減少了 1。
請注意,被交換的最後一個元素可能是您想要移除的值。但是不要擔心,在下一次迭代中,
我們仍然會檢查這個元素。
public int removeElement(int[] nums, int val) {
int i= 0;
int n = nums.length;
while(i<n){
if(nums[i] == val) {
nums[i] = nums[n-1];
//自己的誤區:將值交換,其實不需要,直接把val值捨棄,但是有個問題,如果n-1的值也等於val呢
//解答 可以試着帶一組數據進去,會發現 最後nums[n-1] 仍舊進入if判斷重複操作
n--;
}else i++;
}
return n;
}
題目:最大子序和(經典題)
https://leetcode-cn.com/problems/maximum-subarray/
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
進階:
如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。
法一:
public int maxSubArray(int[] nums) {
int[] maxValue = new int[nums.length];
int res = nums[0];
maxValue[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
maxValue[i] = ((maxValue[i-1] + nums[i]) > nums[i] ? (maxValue[i-1] + nums[i]):nums[i]);
if (maxValue[i] > res){
res = maxValue[i];
}
}
//System.out.print(res);
return res;
法二:
思路:循環,拿到每個數,拿的時候做累加,如果出現小於0的,把累加和重新賦值0,再次累加
public int maxSubArray(int[] nums) {
int res = nums[0];
int sum = 0;
for (int num : nums) {
if (sum > 0)
sum += num;
else
sum = num;
res = Math.max(res, sum);
}
return res;
}
註解: for(元素類型t 元素變量x : 遍歷對象obj){
引用了x的java語句;
}
這是一個foreach循環遍歷....
就是把nums這個數組進行遍歷,它有多少個數,就遍歷多少遍。
遍歷的時候每次就把其中的一個值給num;
for(int i =0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
給這個for循環一樣....
題目:最後一個單詞的長度
https://leetcode-cn.com/problems/length-of-last-word/
給定一個僅包含大小寫字母和空格 ' ' 的字符串,返回其最後一個單詞的長度。
如果不存在最後一個單詞,請返回 0 。
說明:一個單詞是指由字母組成,但不包含任何空格的字符串。
示例:
輸入: "Hello World"
輸出: 5
代碼:
//思路: 從後面開始找,碰到空格就停止
public int lengthOfLastWord(String s) {
int i=0,len = s.length(),count=0;
char [] chars = s.toCharArray();
for(i=len-1;i>=0;i--){ //最後一個
if(chars[i] == ' ') break;
count++;
}
return count;
}
public int lengthOfLastWord(String s) {
int i=0,len = s.length(),count=0;
for(i=len-1;i>=0;i--){ //最後一個
if(s.charAt(i) == ' ')
break;
count++;
}
return count;
}
//思路: 將字符串變成字符串數組然後求最後一個的length
public int lengthOfLastWord(String s) {
String arr[] = s.split(' '); //incompatible types: char cannot be converted to String
int len = arr.length;
int count = arr[len-1].length();
return count;
}
3. 無重複字符的最長子串
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb" 輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb" 輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew" 輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
時間:2018.12.10