35、Search Insert Position
十一、題目:
給定已排序數組和目标值,如果數組中找到目标值,則傳回目标值在排序數組中索引。 如果數組中沒有目标值,傳回目标值順序插入數組中的索引;
假設數組中沒有重複項。
思想:
因為是已經排好序的數組,那麼使用二分查找法找目标值落在數組中的什麼位置。這裡多了一個就是如果數組中沒有目标值,那麼要傳回目标值順序插入數組時的位置,告訴你結論,如果沒找到,這個值就在二分查找low這個位置,(自己去多舉點例子找規律就是)。
Example 1:
Input: [1,3,5,6], 5
Output: 2
Example 2:
Input: [1,3,5,6], 2
Output: 1
Example 3:
Input: [1,3,5,6], 7
Output: 4
Example 4:
Input: [1,3,5,6], 0
Output: 0
package cn.hnu.leetcode.easy;
public class _035_SearchInsert {
public int searchInsert(int[] nums, int target) {
//使用二分查找找目标值
int low = 0;
int high = nums.length-1;
int mid = 0;
while(low <= high){
mid = (low + high)/2;
if(nums[mid] > target){
high = mid - 1;
}else if(nums[mid] < target){
low = mid + 1;
}else{
return mid;
}
}
//如果到最後都沒有找到,就傳回low 即target要插入的位置
return low;
}
}
38、Count and Say
十二、題目:
第一讀取字元串“1”,以後每一次讀取上一次字元串中各個連續相同字元出現的次數;
比如
第一次:1
第二次:11(上一次出現一個1)
第三次:21(上一次出現兩個1)
第四次:1211(上一次出現一個2 一個1)
第五次:111221(上一次出現一個1一個2兩個1)
第六次:312211(上一次出現三個1兩個2一個1)
第七次:13112221(上一次出現一個3一個1兩個2兩個1)
第八次:1113213211(上一次出現一個1一個3兩個1三個2一個1)...........
思想:
将字元串拆成兩個兩個一組,每組第一個數字表示上一次本組第二個數字出現的次數;每一次輸入n,其實都是從第一次字元串“1”開始一點一點往下撸的。詳見代碼
Example 1:
Input: 1
Output: "1"
Example 2:
Input: 4
Output: "1211"
package cn.hnu.leetcode.easy;
public class _038_CountAndSay {
public static void main(String[] args) {
String countAndSay = countAndSay(8);
System.out.println(countAndSay);
}
/**
* 建議先想"1"這個字元串如何在代碼中執行
* 再想"11"在代碼中怎麼執行
* 最後想"1211"和"111221"在代碼中如何執行
* 跟着序号敲
* @param n
* @return
*/
public static String countAndSay(int n) {
//1 如果輸入的n小于等于0 直接傳回空串
if(n<=0){
return "";
}
//2 第一次傳回的字元串
String str= "1";
//3 從第一次開始
int start = 1;
while(start < n){
//4 每次都建立一個新的可變字元串buffer
StringBuffer buffer = new StringBuffer();
//5 每次都将count置1
int count = 1;
for(int i = 1;i<str.length();i++){
//8 比較前後兩個字元是否一樣,如果相同說明是連續的兩個相同字元,count++
if(str.charAt(i)==str.charAt(i-1)){
count++;
}else{
//9 前後兩個字元不一樣
buffer.append(count);
buffer.append(str.charAt(i-1));
//10 别忘了将count重新置1
count=1;
}
}
//6 試想如果n=2的時候,無法進入for循環,直接到這裡
buffer.append(count);
buffer.append(str.charAt(str.length()-1));
//7 str是每一次新的buffer值
str = buffer.toString();
start++;
}//end while
//8 如果進不了while循環,n= 1 ;就是直接傳回"1"
return str;
}
}
53、Maximum Subarray
十三、題目
給定一個随機整數數組,問這個數組中元素相加和最大的子數組和是多少;就是找和最大的子數組,然後把它們的和輸出,而不用關心這個子數組是由哪些元素構成。
思想:
設定一個sum數組,這個數組的大小同給定的數組nums。sum數組的第一個元素就是nums[0];從nums數組的第二個元素周遊,如果這個元素 i 自成一組要比和它前面其它若幹個元素加起來小,那麼它就加入前面若幹個數組的群組成的sum[i] ,否則它就自成一個sum[i] 。請記住sum[i] 中存儲的要麼是nums[i]、要麼就是nums[0]+nums[1]+....+nums[i];然後設定一個max,它存儲sum數組中最大的元素。
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
package cn.hnu.leetcode.easy;
public class _053_MaxSubArray {
/**
* [-2,1,-3,4,-1,2,1,-5,4]
* -2 sum[0] = -2 max = sum[0] = -2
* 1 sum[1] = 1 max = sum[1] = 1 1自成一個sum[1]
* -3 sum[2] = -2 max = sum[1] = 1 -3和1組成一個sum[2]
* 4 sum[3] = 4 max = sum[3] = 4 4自成一個sum[3]
* -1 sum[4] = 3 max = sum[3] = 4 -1和4組成sum[4]
* 2 sum[5] = 5 max = sum[5] = 5 2、-1和4組成sum[5]
* 1 sum[6] = 6 max = sum[6] = 6 1、2、-1和4組成sum[6] ------max
* -5 sum[7] = -1 max = sum[6] = 6 -5、1、2、-1和4組成sum[7]
* 4 sum[8] = 4 max = sum[6] = 6 4自成一個sum[8]
*
*
*
* @param nums
* @return
*/
public int maxSubArray(int[] nums) {
//定義一個新的數組,大小和nums數組一樣
int[] sum = new int[nums.length];
//sum數組的第一個元素就是nums[0]
sum[0] = nums[0];
//初始化max就是nums[0]
int max = nums[0];
for(int i = 1;i<nums.length;i++){
//開始給sum數組指派,意思就是這個數,如果加上前面若幹個數和是否比自己自成一個sum要大
//如果加進去比自己自成一組要大,那麼就加進去,否則自己自成一個sum
sum[i] = Math.max(nums[i], sum[i-1]+nums[i]);
//max總是存儲最大的sum
max = Math.max(max, sum[i]);
}
return max;
}
}
58、Length of Last Word
十四、題目:
給定字元串s是由大寫/小寫字母和空格字元組成,傳回該字元串中最後一個單詞的長度。如果最後一個單詞不存在,則傳回0。
注意:單詞定義為字元序列僅由非空格字元組成。
思想:
使用String的split()方法,傳入一個“ ”,表示再字元串中凡遇到“ ”,就進行切割,将一個字元串變成字元串數組,然後找到最後一個字元串,輸出其長度即可。
Example:
Input: "Hello World"
Output: 5
package cn.hnu.leetcode.easy;
public class _058_LengthOfLastWord {
public int lengthOfLastWord(String s) {
//根據" "字元将字元串拆分成若幹個字元串數組
String[] strArr = s.split(" ");
//如果得到的字元串數組長度是0,傳回0
//否則傳回該字元串最後一個元素的長度
return strArr.length==0? 0:strArr[strArr.length-1].length();
}
}
66、Plus One
十五、題目:
給定表示非負整數的非空數字數組,加上整數的1。存儲數字使得最高有效數字位于清單的開頭,并且數組中的每個元素包含單個數字。整數數組中不包含任何前導零,除了數字0本身,就是數組的首位不能是0。
思想:
首先要明白隻做一次加法,而且隻+1。從數組的最後一個元素開始周遊(其實是看看這個數組每一位是否都是9),如果這個數字+1等于10,那麼就得進位,且數組的這個位置置0,否則直接做+1的操作就可以,如果這個數組全是數字9,那麼就重新new一個數組,這個數組的長度是原數組長度+1,最高位置1,後續的位置依次放置原數組中各個數字。999最後得到的是1000;1899最後得到的是1900;1889最後得到是1890;1888最後得到的是1889。
Example 1:
Input: [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.
Example 2:
Input: [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.
package cn.hnu.leetcode.easy;
public class _066_PlusOne {
public int[] plusOne(int[] digits) {
int i = digits.length-1;
//從數組的最後一個元素開始周遊
while(i>=0){
//如果目前元素+1等于10,就把目前元素置0,然後i--,表示再看它前面一個元素
if(digits[i]+1==10){
digits[i] = 0;
i--;
//如果目前元素+1不等于10
}else{
//因為是一位一位+1,到了這裡,它後面的元素+1肯定會大于9,産生進位1,是以這裡+1
digits[i] = digits[i] + 1;
//加完了就直接傳回數組
return digits;
}
}//end while
//如果整個while循環結束,都沒return,說明這個數組元素全是9
//那就建立一個新的數組,它的長度是原數組+1
int[] newDigits = new int[digits.length+1];
//将這個新數組的首位置1,剩下的元素就是把原數組的所有元素挨個加進去
newDigits[0] = 1;
for(int j = 0;j<digits.length;j++){
newDigits[j+1] = digits[j];
}
return newDigits;
}
}