十一、题目:
给定已排序数组和目标值,如果数组中找到目标值,则返回目标值在排序数组中索引。 如果数组中没有目标值,返回目标值顺序插入数组中的索引;
假设数组中没有重复项。
思想:
因为是已经排好序的数组,那么使用二分查找法找目标值落在数组中的什么位置。这里多了一个就是如果数组中没有目标值,那么要返回目标值顺序插入数组时的位置,告诉你结论,如果没找到,这个值就在二分查找low这个位置,(自己去多举点例子找规律就是)。
Example 1:
Input: [1,3,5,6], 5 Output: 2Example 2:
Input: [1,3,5,6], 2 Output: 1Example 3:
Input: [1,3,5,6], 7 Output: 4Example 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; } }十二、题目:
第一读取字符串“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; } }十三、题目
给定一个随机整数数组,问这个数组中元素相加和最大的子数组和是多少;就是找和最大的子数组,然后把它们的和输出,而不用关心这个子数组是由哪些元素构成。
思想:
设置一个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; } }十四、题目:
给定字符串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(); } }十五、题目:
给定表示非负整数的非空数字数组,加上整数的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; } }