登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Excel 表中某个范围内的单元格】) ^; ]! F7 v- M1 h
+ k- C5 J4 O$ U
解题思路
4 ]8 {8 W0 z6 l7 l) S; t- w. t/ j通过 char 类型的加减法进行坐标转换。# \- \# S+ H5 V. S& I2 K! \
; ~( V7 a O) X代码展示
8 L- {+ _. X" J" j4 W
) J0 i' N+ j. T# ?; Bclass Solution {! }5 Z: J6 O' j' P7 y- M
public List<String> cellsInRange(String s) {- A8 g1 S! g8 G a- K3 t
int startX = s.charAt(1) - '1';
! `# O& O# M; L* s% U k int startY = s.charAt(0) - 'A';
* g( k" a7 y' S, ~. g int endX = s.charAt(4) - '1';
9 h9 _$ i8 N/ M+ R7 [/ \6 \ int endY = s.charAt(3) - 'A';0 v. z& L5 v5 v, e+ [/ j7 Y' u$ h
List<String> res = new ArrayList<>();( g8 O& q0 T6 S! V K$ z: T t
for (int y = startY; y <= endY; y++) {. R X/ e6 F8 ]3 s5 K% G
for (int x = startX; x <= endX; x++) {/ H* l4 q" B$ l4 L
res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));
% t2 ] ]3 E/ G l0 L }
( [4 Q% Z5 O1 d% P }
$ |$ L! @$ C/ I, U( X- G2 S return res;
" Q6 W2 u; Q8 p! P }
. I! _* o! r: f+ |, ~! a& q}
# D& K( @' \/ f, F" x) }$ G0 z1 s: k- W( q9 E8 g" I p
1 ?& A7 ~8 w o) F4 f
【 NO.2 向数组中追加 K 个整数】
6 [, Z9 T3 a, ]" }9 j
_- Z0 N- y9 U# `! ?: i* m解题思路- b/ G# G: `; F: m# g
给原数组排序,然后向有缝隙的位置插入即可。
- [, d% Z5 ] K \/ j2 P$ T& |0 k
- X! S. q: H9 T$ T3 P: a$ T+ y代码展示$ ` E. M! b2 w7 \' W
5 O# W, d2 U0 d$ tclass Solution {
1 W3 {) M$ ^, p' d; K, Z public long minimalKSum(int[] nums, int k) {; @1 w* f3 a5 m7 k) F- i
Arrays.sort(nums);, P! f( Y( _/ }
long res = 0;0 C5 ~4 K6 J& k6 F
int last = 0;* a& ~ a' A. W! \
for (int num : nums) {7 W1 \& E3 y+ R: J
// (last, num). ~% R# I3 u0 }/ `. U+ c
if (last == num) {, n" c. _1 @- z u4 _% |
continue;" b* C% { u6 b
}7 q4 S; P8 d5 }$ ^; E; f( `
int cnt = Math.min(k, num - last - 1);
# {- a9 n4 D) M, T$ r& a k -= cnt;2 Z, y) h5 |' N! w
res += (long) (last + 1 + last + cnt) * cnt / 2;" o/ `& J5 m/ L. J
last = num;: L8 U& t, c; y
if (k == 0) {9 C z: W8 ?- A2 u- }9 @
break;" V" E: t" a8 [6 @7 i9 x" Y
}
( x' p+ o. D2 m- E" o3 q }
$ m- R6 p: b! A- | if (k > 0) {
2 y: H$ q, Q- V+ K& ~8 b res += (long) (last + 1 + last + k) * k / 2;. N& \5 L' t2 f! f- m$ N
}' N6 ~) `( K9 U1 B
return res;
( c# v- x+ g; i) X4 s9 l }, X t; n( f9 r
}
( ]; A5 f9 t3 K# u2 N P( I: {% K; V. n; [
4 L4 u r: h7 O, M【 NO.3 根据描述创建二叉树】% L+ J% ^9 o) p0 d# }
9 T# v! R1 h8 ?- f8 w
解题思路
+ A8 t$ @7 E% p% e6 K' J1 D& r! f4 p使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。
; @& `" a( i! L7 Q7 t) D# z+ Z, h) v4 l9 W: q: }2 v
代码展示+ q- o" _8 D% A% ] b7 P- I2 d
* k) D9 U3 j9 ]' b( k. {( S/ s. Dclass Solution {$ p8 U/ @, b5 T) C% A1 \6 E
public TreeNode createBinaryTree(int[][] descriptions) {9 t$ F" n) h8 S' [
Map<Integer, Integer> parent = new HashMap<>();
- U2 q- j1 K, ~8 ~7 m Map<Integer, TreeNode> valueToNode = new HashMap<>();" S F& g0 S/ u; E
for (var desc : descriptions) {
W4 |; a% r, R. n for (int i = 0; i < 2; i++) {" P& L1 Q' k) _, g: @$ P
if (!valueToNode.containsKey(desc[i])) {
1 t. r. S& Z5 m valueToNode.put(desc[i], new TreeNode(desc[i]));8 h- H. [, I/ O9 _
}; h- P6 N1 Q5 l' \# _; `
}
1 F: I8 T5 l2 H U) G# v% [ parent.put(desc[1], desc[0]);+ ~& f; a8 k& t$ t; n2 n. ?) l
if (desc[2] == 1) {5 u' O& c) v$ v$ {- o* E5 s V
valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);; c- g% ?- s: |1 \. W$ L1 k& T
} else {6 O3 Y$ z8 m/ j/ }! P
valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);3 C; v$ L- b& f3 @4 _4 r3 ?
}
& L; J/ g; Y V6 K( d }% Z& t; E y% p v, v
int cur = descriptions[0][0];
, C u- D/ S! d3 B7 h% a' v0 ]2 ~' `: | while (parent.containsKey(cur)) {: I& }7 d. M$ _# @+ f. h4 O
cur = parent.get(cur);$ b& H8 ?" o- i
}
# ^0 E3 }) g! o q+ F0 F- f, j- ? return valueToNode.get(cur);
- d& t9 A+ \+ T; C S }
8 q% b+ l+ _& l( B9 u, `}. y3 z$ `8 a! {( d# ?2 x5 X% c
0 _. Z/ [2 A. ~【 NO.4 替换数组中的非互质数】4 s2 E$ c G, S# K1 m
% }; S$ q B% V7 C: A5 p5 C解题思路
+ P2 m* s/ q3 X. c9 ]正着遍历、反着遍历,直到无法再合并为止。详见注释。
& H3 }+ L7 V+ C0 V8 V" a" _3 r% S5 e7 _& w( B0 P1 F
代码展示
- Y i$ V. T# m7 [( I1 W6 n
# B- `, y( r1 l( K( w1 U( v; kclass Solution {
+ g2 `2 a6 g, O' m, L public List<Integer> replaceNonCoprimes(int[] nums) {
! M- \( T! P ? List<Integer> list = new ArrayList<>();
7 z7 n' D6 n) @: L: d/ B4 D2 N for (int num : nums) {
7 x7 O/ U. x) A) _5 r: [4 ^+ d list.add(num);4 {1 |' H/ Q# W5 j' d- ^) ?
}- Z- R5 o; V7 \- c; W* W7 t1 G
while (true) {
0 x; p, o/ q' }+ Y/ {1 H // 正着遍历,合并一次
" X9 T# J! q/ K List<Integer> merged = merge(list);
* N3 e5 i% c% S+ ?( ^+ }5 U9 X% @! M if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回
4 ?& _2 d6 H, \ return merged;
0 L+ ?) C4 a) ^ }: k" y8 ?! G. {7 |: ~/ E9 d8 ^
// 反着遍历,合并一次( @0 |/ ]2 \, l3 h6 N& c: p
list = reverse(merge(reverse(merged)));
2 i/ q# Z, P7 |6 ] }9 B- O) |2 l2 R A
}
& O( u3 @, m# `0 r# Z5 {; y
( a/ y, B7 z0 Y$ x6 L private List<Integer> merge(List<Integer> nums) {7 t9 L* X2 O0 I3 }. r
List<Integer> res = new ArrayList<>();2 q1 S4 w+ |" K2 Y
if (nums.size() == 1) {
7 x6 j, T; J1 a }+ D9 e3 U. d- u res.add(nums.get(0));
; y& c; h3 p$ Y; W' P return res;
H! W; f; N! X+ D; M( \ }
! e" {5 Y% S& A4 }7 [% Y // 一次合并中,令 i, j 表示相邻的两个元素6 K |" R0 j6 }+ H
// 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可1 y. O8 s5 q* t+ b1 R
// 最终将结果 add 到 res 中
4 i9 M- Z' U6 Z+ R W for (int i = 0, j = 1; j < nums.size(); j++) {
4 X0 n/ o' o( f int g = gcd(nums.get(i), nums.get(j));
3 F4 h# M2 F6 q0 w' ?9 |8 R if (g > 1) {
! d: p- x5 ^$ Q, M* z nums.set(i, nums.get(i) / g * nums.get(j));
0 L* w" v- a0 b; Z% K5 \5 q0 `5 P7 m* C if (j == nums.size() - 1) {
6 y( m- T! S( M4 \) Q) L* n1 k res.add(nums.get(i));
6 e) i2 d8 r/ ]2 t# R- Q }
) r- _( q5 {: s F } else {
; g# ?; s; D1 a2 Z0 l' _& m res.add(nums.get(i));
g# r2 }( H0 O2 L) b i = j;! V+ J5 V2 R7 j" v+ Q8 e
if (j == nums.size() - 1) {( G( s7 I3 {# @! @
res.add(nums.get(j));
) H6 B; m4 s* { c4 O }5 [# Z* v9 D$ y* m' `+ e+ A% C' n
}3 a$ P3 s% F3 {/ V$ J& b9 Y1 U+ b8 q
}: f0 [6 ]; P" d% d3 v8 s0 |
return res;- Y; y9 K1 a7 y5 B9 U2 P
}! ]# k$ O, a! ^1 t' c5 I
. N% x8 S7 {5 F$ d* n5 _; d$ `$ o private List<Integer> reverse(List<Integer> list) {' E* ?! T% r1 ?0 c4 h5 m0 J
List<Integer> rev = new ArrayList<>();
6 x: n( R4 l u, } for (int i = list.size() - 1; i >= 0; i--) {
[4 K; g1 c# f rev.add(list.get(i));0 Z. h' P8 a1 u+ o/ ?, i4 t q) _
}4 t! G+ i% U% W& R0 r4 I- G
return rev;
# ^& h- m7 x0 r6 t# P }
0 c" Z L% Z. v; {7 _1 p
$ j: l( v& e% N7 B/ u
3 C# V) b+ s+ K' K private int gcd(int a, int b) {; |* v/ X. M L4 V& d
return b == 0 ? a : gcd(b, a % b);
: y* o/ J, r9 |" M: m }
4 L& K2 f a6 W0 O0 a' s} |