1.LeetCode66给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
class Solution {
public int[] plusOne(int[] digits) {
int num =0;
int carry = 1; //进位
for(int i=digits.length-1;i>=0;i--){
num = digits[i]+carry; //对数组加1
digits[i] = num%10; //将num对10求余 存入数组
carry =num/10; //0到9除10为0,10除10为1
if(carry==0){ //判断carry是否变换
break;
}
}
if(carry==0){
return digits;
}
//carry不等于0,建立新数组,新数组长度为原数组长度加1
int[] newarr = new int[digits.length+1];
newarr[0] = 1;
return newarr;
}
}
2.LeetCode724给定一个整数类型的数组 nums
,请编写一个能够返回数组“中心索引”的方法。我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
class Solution {
public int pivotIndex(int[] nums) {
if(nums.length<=1){ //数组长度小于等于1,都没有中心索引
return -1;
}
int leftSum =0;
int rightSum = 0;
int sum =0;
for(int i=0;i
3.LeetCode136.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums); //数组从小到大排序
int i = 0;
while( i < nums.length - 1 ){
if( nums[i] == nums[i+1] ){
i+=2; //相等 步长为二
}else{
return nums[i]; //不等 则返回
}
}
return nums[nums.length - 1]; //循环执行完都没找到则为最后一个
}
}
4.LeetCode905:给定一个非负整数数组 A
,返回一个数组,在该数组中, A
的所有偶数元素之后跟着所有奇数元素。
推荐思路:利用双指针,定义L为数组的最左边元素,R为数组的最右边元素 。
若左偶右奇 L++,R--
若左奇右偶 先交换,L++,R--;
若左奇右奇 R--
若左偶右偶 L++
class Solution {
public int[] sortArrayByParity(int[] A) {
//不改变元素的相对位置,利用插入排序
for(int i=0;i0&&A[j-1]%2==1;j--){ //循环执行条件j>0且A[j-1]为奇数
A[j] =A[j-1]; //将奇数往后移
}
A[j] =e;
}
return A;
}
/*
以下三种全部改变元素的相对位置
public int[] sortArrayByParity(int[] A) {
int[] arr =new int[A.length]; //建立新数组
int m=0;
int n =A.length-1;
for(int i=0;i=j 循环结束
int L=0;
int R=A.length-1;
while(L
5.LeetCode167:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
提示:利用双指针
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int sum=0;
int len=0;
int i=0;
for(int j=0;j=s){
len=len==0?j-i+1:Math.min(j-i+1,len); //三目运算符
sum=sum-nums[i];
i++;
}
}
return len;
}
}
6.LeetCode209:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
提示:滑窗算法
class Solution {
public int[] twoSum(int[] numbers, int target) {
//双指针
int l=0;
int r=numbers.length-1;
while(ltarget){
r--; //sum 大于目标值 则r--
}else{
l++; //sum 小于目标值 则l++
}
}
return null;
}
}
7.LeetCode88:给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int index1=m-1;
int index2=n-1;
int indexEnd=m+n-1;
while(index1>=0&&index2>=0){
if(nums1[index1]>nums2[index2]){
nums1[indexEnd]=nums1[index1]; //nums1[index1]大于nums2[index2] ,将 //将index1的值赋给indexEnd
indexEnd--;
index1--;
}else{
nums1[indexEnd] =nums2[index2];
indexEnd--;
index2--;
}
}
if(index2>=0){
for(int i=0;i<=index2;i++){
nums1[i]=nums2[i];
}
}
}
}