Leetcode刷题 2021.02.25
Leetcode537 翻转图像
给定两个表示复数的字符串。
返回表示它们乘积的字符串。注意,根据定义 i2 = -1 。
比较简单的题吧,就按照乘法公式来就行了。
class Solution {
public String complexNumberMultiply(String a, String b) {
String[] arrA = a.split("\\+");
String[] arrB = b.split("\\+");
int ra = Integer.parseInt(arrA[0]);
int rb = Integer.parseInt(arrA[1].substring(0, arrA[1].length() - 1));
int c = Integer.parseInt(arrB[0]);
int d = Integer.parseInt(arrB[1].substring(0, arrB[1].length() - 1));
int real = ra * c - rb * d;
int virtual = rb * c + ra * d;
return real + "+" + virtual + 'i';
}
}
Leetcode554 砖墙
你的面前有一堵矩形的、由多行砖块组成的砖墙。 这些砖块高度相同但是宽度不同。你现在要画一条自顶向下的、穿过最少砖块的垂线。
砖墙由行的列表表示。 每一行都是一个代表从左至右每块砖的宽度的整数列表。
如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你需要找出怎样画才能使这条线穿过的砖块数量最少,并且返回穿过的砖块数量。
你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。
这题也是比较容易想到的,就遍历一下每个元素就行了,哪里有裂缝就添加一下,最后就用n减去最大的裂缝就是穿过最小的砖的数量了。
class Solution {
public int leastBricks(List<List<Integer>> wall) {
int n = wall.size();
Map<Integer, Integer> map = new HashMap<>();
int max = 0;
for(List<Integer> list : wall){
int sum = 0;
//注意两边不能算,所以遍历到list.size() - 1
for(int i = 0; i < list.size() - 1; i++){
sum += list.get(i);
map.put(sum, map.getOrDefault(sum, 0) + 1);
max = Math.max(max, map.get(sum));
}
}
return n - max;
}
}
Leetcode1432 改变一个整数能得到的最大差值
给你一个整数 num 。你可以对它进行如下步骤恰好 两次 :
选择一个数字 x (0 <= x <= 9).
选择另一个数字 y (0 <= y <= 9) 。数字 y 可以等于 x 。
将 num 中所有出现 x 的数位都用 y 替换。
得到的新的整数 不能 有前导 0 ,得到的新整数也 不能 是 0 。
令两次对 num 的操作得到的结果分别为 a 和 b 。
请你返回 a 和 b 的 最大差值 。
这题比较容易做,但是自己编码比较复杂,就是把所有的情况都想到计算一下就行了。
class Solution {
public int maxDiff(int num) {
char[] arr = String.valueOf(num).toCharArray();
int index = -1, n = arr.length;
char[] max = Arrays.copyOf(arr, n);
char[] min = Arrays.copyOf(arr, n);
for(int i = 0; i < n; i++){
if (arr[i] != '9'){
index = i;
break;
}
}
if (index != -1){
for(int i = 0; i < n; i++){
if (max[i] == arr[index]){
max[i] = '9';
}
}
}else{
max = arr;
}
index = -1;
if (arr[0] != '1'){
for(int i = 0; i < n; i++){
if (min[i] == arr[0]){
min[i] = '1';
}
}
}else{
for(int i = 1; i < n; i++){
if (arr[i] != '0' && arr[i] != '1'){
index = i;
break;
}
}
if (index != -1){
for(int i = 1; i < n; i++){
if (min[i] == arr[index]){
min[i] = '0';
}
}
}else{
min = arr;
}
}
int res = 0;
for(int i = 0; i < n; i++){
res += (int)(max[i] - min[i]) * Math.pow(10, n - i - 1);
}
return res;
}
}