双指针法相关题目

双指针法相关题目

// class Solution {
//     public int removeElement(int[] nums, int val) {
//         Arrays.sort(nums);
//         int slow = 0;
//         int fast = 1;
//         int len = nums.length;
//         for (; fast < len; fast++) {
//             if (nums[fast] == val) {
//                 while (fast < len - 1 && nums[fast + 1] = val) {
//                     fast++;
//                 } else {
//                     nums[slow + 1] = nums[fast];
//                     slow++;
//                 }
                
//             }
//         }
//         return slow;
//     }
// }
class Solution {
    public int removeElement(int[] nums, int val) {
        int len = nums.length;
        int slow = 0;
        int fast = 0;
        while (fast < len) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
                fast++;
            } else {
                fast++;
            }
        }
        return slow;
    }
}

双指针法相关题目

//双指针的快慢指针出现。
//删除重复元素的题目。


//一个指针将数组循环,另一个指针指向我们最终需求的数组位置。

// class Solution {
//     public int removeDuplicates(int[] nums) {
//         int len = nums.length;
//         int slow = 0;
//         int fast = 0;
//         while (fast < len) {
//             //slow就代表着我们要对比的元素
//             if (nums[fast] != nums[slow]) {
//                 nums[slow + 1] = nums[fast];
//                 slow++;
//             } 
//                 fast++;
//         }
//         //最后返回的是个数。数组中的下标加1才是个数。
//         return slow + 1;
//     }
// }

class Solution {
    public int removeDuplicates(int[] nums) {
        int len = nums.length;
        int slow = 0;
        int fast = 0;   
        int temp = Integer.MIN_VALUE;
        while (fast < len) { 
            if (nums[fast] == temp) {
                fast++;
            } else {
                nums[slow] = nums[fast];
                //用到下次对比的值要保留起来
                //知道已经会了,但是我怕以后忘了,先写出来。
                temp = nums[fast];
                fast++;
                slow++;
            }
            
        }
        return slow;
    }
}

 双指针法相关题目

class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0;
        int fast = 0;
        int len = nums.length;
        while (fast < len) {
            if (nums[fast] == 0) {
                fast++;
            } else {
                nums[slow] = nums[fast];
                slow++;
                fast++;
            }
        }
        for (int i = len- 1; i >= slow ; i--) {
            nums[i] = 0;
        }
    }
}

双指针法相关题目 

双指针法相关题目

class Solution {
    public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = Math.abs(nums[i]);
        }
        // for (int x : nums) {
        //     x = Math.abs(x);
        // }
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i] * nums[i];
        }
        //这么写错了
        // for (int x : nums) {
        //     x = x * x;
        // }
        return nums;
    }
}

//这个就是利用了,一个数组中的数值经过变换放到一个新的数组中
class Solution {
    public int[] sortedSquares(int[] nums) {
        int len = nums.length;
        int[] res = new int[len];
        int i = 0;
        j = len - 1;
        pos = len - 1;
        while (i <= j) {
            if (nums[i] * nums[i] > nums[j] * nums[j]) {
                ans[pos] = nums[i] * nums[i];
                i++;
            } else {
                ans[pos] = nums[j] * nums[j];
                j--;
            }
            pos--;
        }
        return res;
    }
}

双指针法相关题目

双指针法相关题目

class Solution {
    public String replaceSpace(String s) {
        int sLen = s.length();
        
        int count = 0;
        for (int i = 0; i < sLen; i++) {
            if (s.charAt(i) == ' ') count++;
        }
        char[] chArray = new char[sLen + 2 * count];
        //一个数组中的数值经过变换放到一个新的数组中
        //长度不一样时候得赋值写法
        int i = 0;
        int j = 0;
        while (i < chArray.length) {
            char ch = s.charAt(j);
            if (ch == ' ') {
                chArray[i++] = '%';
                chArray[i++] = '2';
                chArray[i++] = '0';
            } else {
                chArray[i++] = ch;
            }
            j++;
        }
        return new String(chArray);
    }
}

 双指针法相关题目

class Solution {
    public String reverseWords(String s) {
        int left = 0, right = s.length() - 1;
        // 去掉字符串开头的空白字符
        while (left <= right && s.charAt(left) == ' ') {
            ++left;
        }

        // 去掉字符串末尾的空白字符
        while (left <= right && s.charAt(right) == ' ') {
            --right;
        }

        Deque<String> d = new ArrayDeque<String>();
        StringBuilder word = new StringBuilder();
        
        while (left <= right) {
            char c = s.charAt(left);
            if ((word.length() != 0) && (c == ' ')) {
                // 将单词 push 到队列的头部
                d.offerFirst(word.toString());
                word.setLength(0);
            } else if (c != ' ') {
                word.append(c);
            }
            ++left;
        }
        d.offerFirst(word.toString());

        return String.join(" ", d);
    }
}

双指针法相关题目

 

上一篇:数据结构与算法基本功:单链表是否有环,两种方式


下一篇:python 环形链表