登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Excel 表中某个范围内的单元格】
x! d; b1 n3 E
' o# {1 o$ H0 Y7 z, a解题思路9 |7 s# M+ o5 E) v. ~
通过 char 类型的加减法进行坐标转换。
+ m& e! ~4 h' o4 C0 L# W( K, K% \: \7 ?! ^5 h
代码展示
, ^2 O8 \- m' J+ X) `, D5 q) x( L$ J) S2 A! r5 L
class Solution {/ I/ i0 f2 x: \% `* h7 P7 z
public List<String> cellsInRange(String s) {& C2 Q, O, M) V: ~1 O& I. Q
int startX = s.charAt(1) - '1';5 S, H, Z# J9 ^! v; d( N1 |: }
int startY = s.charAt(0) - 'A';
5 ^2 Z* ]. E: y6 o& ] int endX = s.charAt(4) - '1';* {: O& }! I1 x \0 `! m5 o( i
int endY = s.charAt(3) - 'A';1 L B# y$ I0 x6 }/ Z% C$ l2 P2 O
List<String> res = new ArrayList<>();
1 @1 u+ f/ j* R for (int y = startY; y <= endY; y++) {- z4 I* [0 O+ R8 S7 E
for (int x = startX; x <= endX; x++) {
% c4 I7 U: D2 i) X1 S p* \ res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));5 E: P2 R; Q' q9 c% L
}
: Z. w% D; {% a) C" } }
: [! {$ R0 U4 w& j1 a5 u; f0 S return res;
! k# K3 r- n* [& W( D8 c }
. o" F' i8 ]( Z% M& k8 J* u8 I}7 H0 q1 X9 o5 `9 Z
+ h! `: a! ~8 m, r( _% R8 P! \$ c# @. y: m9 ~, O6 i
【 NO.2 向数组中追加 K 个整数】% v2 ^, f8 L/ t% C1 S' E/ f
7 t' v) R0 G+ L5 j' B }解题思路# ^2 | X+ t5 C! F2 i' T
给原数组排序,然后向有缝隙的位置插入即可。; ^4 Z' ~% x( ^
' o* C# V* w3 F6 Y代码展示
! }. Q- S! M) a* e. z8 j( a) t1 U- C n# L6 |
class Solution {
_ ^, P* N9 G+ Y2 p. p public long minimalKSum(int[] nums, int k) {! J5 z+ M+ t# R
Arrays.sort(nums);1 G* c% z7 L8 N# l' Q9 T- ?
long res = 0;
$ B. l6 U3 ]5 g" J( O int last = 0;
8 W' \$ R9 P+ p4 o( C for (int num : nums) {; ?$ }* R8 m& ]1 T# U% o1 @$ k
// (last, num)% T/ C- a4 g/ ^$ j& ?
if (last == num) {, X8 _1 K4 ]. O" g5 V
continue;
% t9 v! U- V, S: |# s8 _3 |: f# }- P }: ^- S! F- m2 A* ?5 r) W
int cnt = Math.min(k, num - last - 1);. I9 S9 ?* r; M, y' Y3 T" W8 D) Q
k -= cnt;
5 t( v9 I7 A6 o5 W) g0 p res += (long) (last + 1 + last + cnt) * cnt / 2;1 y' O. Z# Z8 o( M! C/ I3 z/ g9 z
last = num;
g' p, e6 S1 X1 C if (k == 0) {
' \0 b7 C# k7 D: S; w: D6 q) r( z break;; w- O8 U% u+ F: ?
}
7 z }' _' T, m }
- E& d; H; Z7 h' G7 h if (k > 0) {
/ O" I- M6 R2 N4 k& Q' P res += (long) (last + 1 + last + k) * k / 2;2 b( w6 C, L7 x
}
$ P. [- w6 w2 X* Y3 v return res;( S: d( Y" U( f5 [+ ]
}
) W7 b- U; J2 x+ U$ I" G}
( L( u6 B6 U+ V$ O: R# J9 |. ?) _. u& Q1 J+ ]
6 ^: k- S4 Q4 U$ ]6 ]【 NO.3 根据描述创建二叉树】$ ], Q: ^0 n1 C+ i9 r
7 N# N: l# P7 |9 N" v& x% W解题思路
$ i! v2 n0 w" V. S$ Q$ J使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。
. Q: H, M8 ]3 J( D
9 }9 P3 p* t- a4 V E代码展示 A# ^1 d3 m8 u V3 f6 s0 b
. u( z9 P, O% g$ N) ]1 `
class Solution {
2 }+ w* O$ Z& S public TreeNode createBinaryTree(int[][] descriptions) {
8 J% P2 z4 b) u* M Map<Integer, Integer> parent = new HashMap<>();
4 Z* o) r+ d- F Map<Integer, TreeNode> valueToNode = new HashMap<>();& h: v N& H0 X
for (var desc : descriptions) {
3 _8 f3 t3 ]& E for (int i = 0; i < 2; i++) {, ^8 ^9 P3 x9 W; B! O
if (!valueToNode.containsKey(desc[i])) {
5 I3 M2 b5 }$ I+ c" }% k valueToNode.put(desc[i], new TreeNode(desc[i]));3 k( ~7 [1 t0 j4 U1 Y
}# m; F: I5 |+ \: F2 h' ~3 g
}9 Y" J- i7 C9 m- k: T& J* x* F) }
parent.put(desc[1], desc[0]);
4 [ I5 t% b y ^7 [7 l if (desc[2] == 1) {& p9 g( N4 E) h) U/ o& Q6 q1 S
valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);
& u- P' E/ k% f' [7 c/ k0 Q2 S; D } else {* ?7 I; K5 S1 {+ @1 a
valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);8 b3 ~$ T- p' R' i: P+ R
}
1 I* @' _1 m+ Q$ d. i+ D# ~& \ }- t, M @, i' ]7 P! O
int cur = descriptions[0][0];/ V2 G# t' ^" ?. B! A6 e
while (parent.containsKey(cur)) {; y' K, n" u7 C }0 V
cur = parent.get(cur);5 v' K% z3 ?; g* D3 A) P
}, q( e% ~3 V0 w3 x7 H+ ~& K
return valueToNode.get(cur);
4 C; ~* Z) k f1 z9 y1 P }
- @. D8 d8 { Q3 g6 L% @}1 y3 E0 Z0 a( h
/ T6 F& l6 @$ g
【 NO.4 替换数组中的非互质数】* B( G8 U! v1 r7 p/ l
, F# o3 a4 e' Y% }, }) q
解题思路0 P' h3 {& p- T0 S9 A; |
正着遍历、反着遍历,直到无法再合并为止。详见注释。
* O" T( k* {: [9 b
7 n- H# n+ v( }( H2 K代码展示
; Y) d% G, F" L; X) z# t
! v0 N7 e5 X; Lclass Solution {' X" i* r8 {! v
public List<Integer> replaceNonCoprimes(int[] nums) {+ H# h. k3 r. M# X& F! C
List<Integer> list = new ArrayList<>();
9 x& N1 v9 R. V. D9 A for (int num : nums) {
7 |- P" O' }1 k; k% F R X list.add(num);
9 a; c! A0 i, j9 \5 ?: c }
, G1 G/ [8 x1 b# ? while (true) {
& s5 B8 w3 \- c$ I3 s2 R$ N4 P // 正着遍历,合并一次& ^6 M& O- H% v- Q; _3 @, s2 ?4 o! C) L
List<Integer> merged = merge(list);. | |# d/ l* J5 G) {
if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回
+ _, I1 L M( X return merged;
) T$ N I7 T4 E6 {7 E9 G }
! t9 Q: I# K# | // 反着遍历,合并一次* T2 T+ E# P( Y/ Q5 ~) v& l) u" c
list = reverse(merge(reverse(merged)));' B7 h5 g/ s! U2 B4 h& p
}/ u* Q& B& \, O1 V9 F) g; z
}
$ `1 \0 Q& f7 H! R
6 E3 H) a! U) y$ S3 g private List<Integer> merge(List<Integer> nums) {
2 }7 Q' Z+ G, O0 Y" l List<Integer> res = new ArrayList<>();6 |7 g' w& R2 g' Q
if (nums.size() == 1) {
2 B6 Y* B! r( d2 ^# @ res.add(nums.get(0));
& m3 h n1 O0 _2 W0 \ return res;+ j4 l3 j5 i# T3 H$ R- {
}
; l. e4 ^9 U4 q // 一次合并中,令 i, j 表示相邻的两个元素; `: x7 W `' u& z0 p1 b1 \0 h- x
// 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可* p0 j- J% p# B' s* E+ ?1 P
// 最终将结果 add 到 res 中( T0 Y/ r& u. V; v, q
for (int i = 0, j = 1; j < nums.size(); j++) {0 h* ?# X$ w% {& B" X. t1 A, L. A
int g = gcd(nums.get(i), nums.get(j));
. G! P0 e9 h4 H if (g > 1) {
: e- u# [& T& R, F. h nums.set(i, nums.get(i) / g * nums.get(j));
. O. S. K+ X0 z0 h3 E# G if (j == nums.size() - 1) {
+ x8 f: k+ Q3 n res.add(nums.get(i));
% T; U- H" H5 C" u: D1 ^4 p& k& a }) n3 m. @- T* h0 e) J6 k+ ]0 j
} else {: y7 f6 h5 P3 R# p: e& N4 o
res.add(nums.get(i));
; K- {! z* z1 y7 n/ O i = j;: w1 z5 n ^! u# G& ]0 |% n
if (j == nums.size() - 1) {
3 a3 c9 [* s6 Z( w, \& `3 {& L res.add(nums.get(j));: z( x( J/ g; q. v& d ]/ d H
}
6 S, M* L3 [# @: X9 W5 L }
/ ~7 v) c; u9 I }
4 T% T) ^4 g3 Z( d( @% ^) Z. L4 ^' A return res;
0 _2 B) V' M; z+ z }
3 W: A! X) v/ d' L
& N: c% D5 @) Y private List<Integer> reverse(List<Integer> list) {( N$ s% {$ z/ L, X9 @2 C2 \
List<Integer> rev = new ArrayList<>();
+ O k3 U8 S W( u( J# q for (int i = list.size() - 1; i >= 0; i--) {
. k& q9 E* a5 t: w2 S) @) X rev.add(list.get(i));' @2 k1 S1 P4 X8 t# R
}
) S8 H& p, A* D+ H' W return rev;. M: U5 C9 C d7 e" a$ ~
}0 D- ~9 S# v' ]
, [4 L+ I J3 m! J5 i
: S& z% B5 G9 j, b3 N: \2 B
private int gcd(int a, int b) {, R* |0 E- V# U) T
return b == 0 ? a : gcd(b, a % b);
! Y9 D" V4 M1 T+ f4 [' G6 G5 P. ~ }- V" Z9 A" d/ G- i, g
} |