蓝桥杯基础练习(实现strStr() ,移除元素,最大子序和,最后一个单词的长度,无重复字符的最长子串)

题目:实现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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章