标签:它的 problem merge targe 而且 class 链接 leetcode tps
示例:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
链接:https://leetcode-cn.com/problems/plus-one
参考题解大神的巧妙解法:Java数学解题
一个数用数组存储,那么加上1之后只有两种情况
/**
* 将一个用表示数字的数组传入,加上1之后,返回新数组
* @param digits 传入的数组
* @return 返回加一之后的新数组
*/
public static int[] plusOne(int[] digits){
int len = digits.length;
for(int i = len-1;i>=0;i--){
digits[i]++;
digits[i] = digits[i]%10;
//末位不是9,直接返回
if(digits[i]!=0) return digits;
}
//最高位为9的情况,创建一个比原数组长1的数组
int[] newDigits = new int[len+1];
//首位置1,其余初始化为0
newDigits[0] = 1;
return newDigits;
}
说明:
示例:
输入:
nums1 =[1,2,3,0,0,0],m =3
nums2 =[2,5,6],n =3
输出: [1,2,2,3,5,6]
链接:https://leetcode-cn.com/problems/merge-sorted-array
参考题解:画解算法
/**
* 合并并排序到第一个数组
*
* @param nums1 传入的第一个数组
* @param m 第一个数组的长度
* @param nums2 传入的第二个数组
* @param n 第二个数组的长度
*/
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m - 1;//指向nums1的有数字的最后一位
int p2 = n - 1;//指向nums2的有数字的最后一位
int p = m + n - 1;
//从有数字的最后一位向前,一一对比,两者较大的数存到nums1的p位置,分别向前
while (p1 >= 0 && p2 >= 0) {
nums1[p--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
}
//由于是存到nums1上的,所以保证最后p1无元素可指的时候,把nums2上的元素按顺序拷贝到nums1
System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
}
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
参考题解:双指针求解两数之和
/**
* 得到传入数组中两个元素和刚好是目标数字的位置,用数组返回
* @param numbers 传入的目标数组
* @param target 传入的目标数字
* @return 返回两元素和为目标数字的对应位置
*/
public static int[] twoSum(int[] numbers,int target){
int i = 0;
int j = numbers.length-1;
if(numbers == null) return null;
while(i<j){
int sum = numbers[i]+numbers[j];
if(sum==target) return new int[]{i+1,j+1};
else if(sum>target){
j--;
}else{
i++;
}
}
return null;
}
标签:它的 problem merge targe 而且 class 链接 leetcode tps
原文地址:https://www.cnblogs.com/summerday152/p/12221970.html