16. 最接近的三数之和
思路:类似于三数之和的解题,但是更加简单,不用考虑组合重复。
class Solution {
public int threeSumClosest(int[] nums, int target) {
// 最接近演化为差的绝对值最小
// 双指针解题
// 三数之和的双指针是固定一个索引之后,在一个for循环内部进行双指针解题
Arrays.sort(nums);
int res = nums[0]+nums[1]+nums[2];
int n = nums.length;
for(int k=0; k<n-2; k++){
int i = k+1;
int j = n-1;
while(i<j){
int cur = nums[i]+nums[j]+nums[k];
res = Math.abs(cur-target)<Math.abs(res-target)?cur:res;
if(cur>target)
j--;
else
i++;
}
}
return res;
}
}
字符串实现加减运算系列问题
415. 字符串相加
class Solution {
public String addStrings(String num1, String num2) {
int i = num1.length()-1;
int j = num2.length()-1;
int bit = 0;
StringBuilder builder = new StringBuilder();
// 注意两个数可能是不同的长度
while(i>=0 || j>=0){
int a = i>= 0? num1.charAt(i--)-'0':0;
int b = j>= 0? num2.charAt(j--)-'0':0;
builder.append((a+b+bit)%10);
bit = (a+b+bit)/10;
; }
// 最后关键的进位要写到结果的最顶位
if(bit != 0)
builder.append(bit);
return builder.reverse().toString();
}
}
67. 二进制求和
class Solution {
public String addBinary(String a, String b) {
// 两数相加
int i = a.length()-1;
int j = b.length()-1;
int bit = 0;
StringBuilder res = new StringBuilder();
while(i>=0 || j>=0){
int aa = i>=0 ? a.charAt(i--)-'0':0;
int bb = j>=0 ? b.charAt(j--)-'0':0;
res.append((aa+bb+bit)%2);
bit = (aa+bb+bit)/2;
}
if(bit == 1)
res.append(1);
return res.reverse().toString();
}
}
43. 字符串相乘
class Solution {
public String multiply(String num1, String num2) {
StringBuilder res = new StringBuilder();
List<String> list = new ArrayList<>();
if(num2.equals("0")||num1.equals("0"))
return "0";
// 交错运算
for(int i=num1.length()-1; i>=0; i--){
int carry = 0;
// 存储num1每位于num2的乘积
StringBuilder cur = new StringBuilder();
int a = num1.charAt(i)-'0';
for(int j=num2.length()-1; j>=0; j--){
int b = num2.charAt(j)-'0';
cur.append((a*b+carry)%10);
carry = (a*b+carry)/10;
}
// 位溢出
if(carry != 0)
cur.append(carry);
cur.reverse();
// 位数左移
for(int k=0; k<num1.length()-i-1; k++)
cur.append(0);
// 每次乘积的结果如列表保存
list.add(cur.toString());
}
// 两两相加
for(int i=1; i<num1.length(); i++){
list.set(i, plus(list.get(i-1), list.get(i)));
}
return list.get(list.size()-1);
}
public String plus(String num1, String num2){
int i = num1.length()-1;
int j = num2.length()-1;
StringBuilder builder = new StringBuilder();
int bit = 0;
while(i>=0 || j>=0){
int a = i>=0? num1.charAt(i--)-'0':0;
int b = j>=0? num2.charAt(j--)-'0':0;
builder.append((a+b+bit)%10);
bit = (a+b+bit)/10;
}
if(bit == 1)
builder.append(bit);
return builder.reverse().toString();
}
}
50. Pow(x,n)模拟
class Solution {
public double myPow(double x, int n) {
// 快速幂方法,将幂值通过递归,实现快速翻倍的迭代
int N = n;
return N>=0? quickMul(x, N) : 1.0/quickMul(x, N);
}
public double quickMul(double x, long N){
if(N==0)
return 1.0; // X^0 = 1
double y = quickMul(x, N/2); // 计算X^n/2, n处于奇数时就多乘一个x
return N%2 == 0? y*y : y*y*x;
}
}