文章目录
1. 移动零
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
代码实现
public void moveZeroes(int[]nums) {
/**
使用两个指针:
i --> 当前遍历的元素下标
j --> 实际不为0的元素下标
*/
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
if (i > j) {
nums[j] = nums[i];
nums[i] = 0;
}
//元素不是0 j++
j++;
}
}
}
//简单思路(效率低)
public void moveZeroes(int[]nums) {
int count=0;
for (int i = 0; i < nums.length; i++) {
if (nums[i]==0) {
count++;
}else {
nums[i-count]=nums[i];
}
}
for (int i = nums.length-count; i < nums.length; i++) {
nums[i]=0;
}
System.out.println(Arrays.toString(nums));
}
2.移除元素
题目描述
代码实现
public int removeElement(int[] nums, int val) {
int j = 0;
int lens=nums.length;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val) {
if (i > j) {
nums[j] = nums[i];
nums[i] = val;
}
j++;
}else {
lens--;
}
}
return lens;
}
3.删除排序数组中的重复项
题目描述
代码实现
public int removeDuplicates(int[] nums) {
int j = 1;
int lens = nums.length;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[i - 1]) {
if (i > j) {
nums[j] = nums[i];
// nums[i]=nums[i-1];
}
j++;
} else {
lens--;
}
}
return lens;
}
方法二:
public int removeDuplicates1(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
4.删除排序数组中的重复项 II
题目描述
代码实现
int j=1;
boolean flag=true;
int lens=nums.length;
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[i - 1]) {
flag=true;
if (i > j) {
nums[j] = nums[i];
// nums[i]=nums[i-1];
}
j++;
} else if (nums[i] == nums[i - 1]&&flag) {
flag=false;
nums[j]=nums[i];
j++;
}else {
lens--;
}
}
return lens;
5.颜色分类
题目描述
代码实现
public static void swap(int[] nums,int i,int j) {
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
//1 0 2 1
/*0 1 2 1
*0 1 1 2
*
* **/
public static void sortColors2(int[] nums) {
int left=-1;
int right=nums.length;
int i=0;
while (i<right) {
if (nums[i]==0) {
left++;
swap(nums, left, i);
i++;
}else if (nums[i]==2) {
right--;
swap(nums, right, i);
}
else {
i++;
}
}
}
具体解析
6.两数之和 II
题目描述
代码实现
public int[] twoSum(int[] numbers, int target) {
int index1 = 0;
int index2 = numbers.length - 1;
int sum=0;
while (index1<index2) {
sum=numbers[index1]+numbers[index2];
if (sum<target) {
index1++;
}else if (sum>target) {
index2--;
}else if (sum==target) {
break;
}
}
return new int[]{index1+1,index2+1};
}
7.验证回文串
题目描述
代码实现
public static boolean isPalindrome(String s) {
s=s.toLowerCase();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) <= 122 && s.charAt(i) >= 97 || s.charAt(i) <= 57 && s.charAt(i) >= 48) {
sb.append(s.charAt(i));
}
}
if (sb.toString().equals(sb.reverse().toString())) {
return true;
}
return false;
}
8.反转字符串中的元音字母
题目描述
代码实现
public String reverseVowels(String s) {
if (s==null||s.length()==0) {
return s;
}
String vowels="aeiouAEIOU";
//将字符串转换成char类型数组
//一般遇见字符串问题,能转成字符数组就尽量转(方便);
char[] chars=s.toCharArray();
int start=0;
int end=s.length()-1;
while (start<end) {
//双指针相向而行,找元音字母
while (start<end&&!vowels.contains(chars[start]+"")) {
start++;
}
while (start<end&&!vowels.contains(chars[end]+"")) {
end--;
}
swap(chars, start, end);
start++;
end--;
}
return new String(chars);
}
private void swap(char[] chars,int start,int end) {
char temp=chars[start];
chars[start]=chars[end];
chars[end]=temp;
}
9.盛最多水的容器
题目描述
代码实现
public int maxArea(int[] height) {
// int lt=0;
// int rg=height.length-1;
int area=Integer.MIN_VALUE;
int res=Integer.MIN_VALUE;
for (int i = 0; i < height.length; i++) {
for (int j = 1; j < height.length; j++) {
area=Math.min(height[i], height[j])*(j-i);
res=Math.max(area, res);
}
}
return res;
}
//方法二:效率更高
public int maxArea2(int[] height) {
int l=0,r=height.length-1;
int ans=0;
while (l<r) {
int area=Math.min(height[l], height[r])*(r-l);
ans=Math.max(ans, area);
if (height[l]<=height[r]) {
++l;
}else {
--r;
}
}
return ans;
}
10.长度最小的子数组
题目描述
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
代码实现
public int minSubArrayLen(int s, int[] nums) {
int n=nums.length;
if (n==0) {
return 0;
}
int left=0;
int right=0;
int sum=0;
int min=Integer.MAX_VALUE;
while (right<n) {
sum+=nums[right];
right++;
while (sum>=s) {
min=Math.min(min, right-left);
sum-=nums[left];
left++;
}
}
return min==Integer.MAX_VALUE?0:min;
}