登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Excel 表中某个范围内的单元格】
# u K* C# O6 \7 V8 k1 h9 K( _8 J' v8 ` }: w
解题思路) z$ l. u$ V d1 Y9 l
通过 char 类型的加减法进行坐标转换。
/ p7 h+ c( Q; W" d( @6 l4 a/ N& ~: M" z
代码展示
# y; `; }! S/ f$ q( I3 {1 M! ~5 _5 @3 Y0 i# h$ _
class Solution {) h, S% V1 }6 O/ T1 c; Y5 i$ ?
public List<String> cellsInRange(String s) {
: ~: b. ?3 M: X6 | int startX = s.charAt(1) - '1';9 T, J" i, N& x) X9 E( m8 s
int startY = s.charAt(0) - 'A';
' c- |) E1 A X# B# U- J4 } int endX = s.charAt(4) - '1';7 J# P" g5 J' e# e0 J
int endY = s.charAt(3) - 'A';
8 n8 k" I! y; N t List<String> res = new ArrayList<>();
$ e& G2 p1 P3 j6 |& L# c3 \ for (int y = startY; y <= endY; y++) {2 W: Q% F' H! T/ d1 G0 }1 B
for (int x = startX; x <= endX; x++) {
: h. h9 U3 w$ F7 V) U res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));) _( v2 Q: a; l* F* @ U
}
' U7 b8 Y# [* q% ?! S1 A }
. l5 B! t; | o& N! I- o- Z" P- x return res;
+ [7 Z$ @8 f. a3 L& r$ F1 { }
" x. Y( T9 s H* a}: q3 Y# x8 r$ u4 Y8 i* `; ]' W
& u; n3 z0 Q8 n
( h; y8 F" A. E% T【 NO.2 向数组中追加 K 个整数】
* q. q, p0 ~( l& N2 Z# n: d; j* A
解题思路6 K7 M; q2 J+ ^# j! f. }! X, d
给原数组排序,然后向有缝隙的位置插入即可。9 o* N4 J0 T: l5 B
3 v/ `6 n+ }9 U% k2 ?- o( T: J/ `
代码展示
9 q0 m1 x' Q$ k; n+ K, u5 O! U" r# ]& b' z: n
class Solution {0 c: l G% ~) K+ w" N8 v
public long minimalKSum(int[] nums, int k) {
& Q% c! k( m$ o0 i" o Arrays.sort(nums);% S' @& \- B T% p
long res = 0;1 g# Y7 |$ X/ p1 i$ C+ s% O
int last = 0;: b3 y4 m, i+ K) O! H8 f5 g
for (int num : nums) {" @- D. R# R+ ?6 }
// (last, num)5 W6 ^9 ?0 c* o
if (last == num) {
0 b1 [, Z; L+ K+ z continue;6 m% C, s# b4 L- y) R2 |0 c+ C' ~/ p
}. P4 r0 ?/ j' [" H
int cnt = Math.min(k, num - last - 1);
; i, b* o2 {, a6 M! h% e k -= cnt;
* O9 Y L. W, Q. r8 U& y res += (long) (last + 1 + last + cnt) * cnt / 2;7 x/ [5 J- x% k
last = num;' x; c. |. U( J$ S2 C+ m
if (k == 0) {
2 n1 U) w# q/ g U4 _( P9 l break;
: f5 l& Y/ ]; j: E9 f- g }
' z( U# L" l& W0 s) {4 k }
7 ?% D# ]8 C5 m( Y if (k > 0) {5 |; s! R5 g% \3 y
res += (long) (last + 1 + last + k) * k / 2;# V- r3 q2 u5 a, t9 } f
}5 M0 W6 _4 K$ S) l8 o G( r
return res;
: Z0 L* A; g" V* D }6 q, \3 s2 x1 i3 }3 g! W# E
}
( [0 x5 G; _; Q) r2 r m# }% s5 t. W, o' G5 ^0 j+ b
2 M: C* Y9 g: q( L" O
【 NO.3 根据描述创建二叉树】, A$ o A( C" o( n' }, n
3 l+ S; j' v6 K2 ?, S5 w. U解题思路4 b/ b1 Y9 X; R Y7 H! O
使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。
6 x4 S( R; j1 e \" `9 ?2 o0 C$ Q! X
代码展示; [/ b' E, s( }8 w0 O
2 O5 J' `* ^( A- n& E
class Solution {1 W6 x4 F! r" i- {0 N p+ r% W# N
public TreeNode createBinaryTree(int[][] descriptions) {
( x7 \/ g/ u% d; C' T Map<Integer, Integer> parent = new HashMap<>();
0 R9 _8 g4 I" k, a$ P3 w Map<Integer, TreeNode> valueToNode = new HashMap<>();- ~0 ?( P0 H) \7 T
for (var desc : descriptions) {3 R" x. e1 d- Z2 z8 f
for (int i = 0; i < 2; i++) {
" `: R9 \* s3 b G$ d if (!valueToNode.containsKey(desc[i])) {; u0 a, D9 S8 Y( [5 f/ t; l
valueToNode.put(desc[i], new TreeNode(desc[i]));: F9 T3 Z0 a; w6 Q$ F
}
% n* F0 N5 w$ O: u* _. l }
- y2 J/ G- Q! ?1 d7 d* q parent.put(desc[1], desc[0]);
1 e5 v6 F0 q4 A1 O1 R if (desc[2] == 1) {
8 J) K9 P. s A$ Z/ O- }" s valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);+ T: U5 M7 W* [$ s! a2 P
} else {; }* M9 f( ]0 w
valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);1 f9 `5 l) d( s4 k
}
- `: c- [' O5 o, S }1 {' l! T- T; `5 `* Z
int cur = descriptions[0][0];
- e2 F5 R3 B/ \ while (parent.containsKey(cur)) {
% L1 G/ y* c, ]5 `# d- X5 [& C, a6 | cur = parent.get(cur);
9 P6 r6 q' M% a' B* B- h& b }- a' Q1 M: {: a- F `4 b
return valueToNode.get(cur); M, n9 X0 U4 M% F
}
+ ` C: M6 j% |* }}
* ^8 Z4 x$ m' f% K3 G4 A7 q
: V8 f; K' n$ V1 C; D【 NO.4 替换数组中的非互质数】
% n. L, ]' v9 G e) Y/ ]* }! y6 C3 Y
解题思路
$ w8 k$ y' T4 F" o, ]正着遍历、反着遍历,直到无法再合并为止。详见注释。+ F! P. w( F4 Y4 Y# S
* T% T! J( e5 i3 y: ?0 w7 x7 [' a1 Q代码展示5 n. S, Z0 u% D9 S0 o) e
! E2 f3 S' U/ f1 e# F, f
class Solution {$ \+ v3 ^' Y) V3 z! u+ h( h
public List<Integer> replaceNonCoprimes(int[] nums) {" E9 ]# _; P( V/ z" Z. g4 C
List<Integer> list = new ArrayList<>();
) W8 U2 q+ V9 Z+ T1 f for (int num : nums) {* e" w* {7 p. o. S k: p
list.add(num);& v/ i$ b2 Z2 p' N
}
$ g2 L5 _- q$ P7 v while (true) {
1 E, \2 o! G! {% d% [' a( a0 E // 正着遍历,合并一次
7 Y: D6 u6 D+ ^9 ]8 F* | List<Integer> merged = merge(list);: y! U) _* s9 D
if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回3 C! h6 j' m3 l/ z- S8 Y( v4 K2 {
return merged;
) [0 }+ \8 H- F! R/ R" N* d! w }
# ^8 T) ~; Q1 Y' ?7 U6 e9 o // 反着遍历,合并一次! j2 W% v, Y6 ~9 \- g( d
list = reverse(merge(reverse(merged)));& }! r7 k5 c/ c0 z" m6 g
}/ f0 t$ E8 K* k% e7 Q
}, C3 W9 n5 B6 z0 a) [4 p! ^
" k6 q+ z+ k L0 a) Y& Y private List<Integer> merge(List<Integer> nums) {) f* s! b' V5 R3 }! ^) @
List<Integer> res = new ArrayList<>();' i$ r9 q$ x K1 `8 U
if (nums.size() == 1) {
/ o2 N8 D: z. s1 E- ^, p% h res.add(nums.get(0));
0 l% {/ [4 K$ X, _ return res;: o3 J9 Q' E; a9 I( x% ^: Q
}5 C+ z% ~8 U- b! s! ^
// 一次合并中,令 i, j 表示相邻的两个元素6 }' W; u2 X( W; M/ _) H
// 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可
! {! [1 F' i6 f, J' B' B& q // 最终将结果 add 到 res 中5 s8 r( {9 k, [. D9 {6 R2 k
for (int i = 0, j = 1; j < nums.size(); j++) {
! ]2 f q* V1 [5 D- P int g = gcd(nums.get(i), nums.get(j));
" S9 i$ D- c/ I8 v( L if (g > 1) {
. d9 {# M5 ?* c) l5 g9 e nums.set(i, nums.get(i) / g * nums.get(j));
+ r8 m0 B q0 | if (j == nums.size() - 1) {( e$ b7 R/ p# X; A6 h
res.add(nums.get(i));* v3 ?, m& u0 P4 x# k1 k
}
; Q% D: Y- }9 M$ c3 } I8 l } else {/ `, O, E* m: ^ M# A/ R7 i
res.add(nums.get(i));) `, ~' \* k5 a0 ?% c) i
i = j;
7 i+ h. Y- d+ F% n" }8 d if (j == nums.size() - 1) {5 C/ L! ^# d& M
res.add(nums.get(j));$ h+ H& u# g& S5 c% o
}
6 h/ T) X2 e( \$ ^, l) n2 E }6 y1 m) j! e' ~& S* j" H
}
& j1 a) ] @9 ?% q+ R5 D return res;" P$ W/ _5 K. G0 ?0 ?
}1 C# X- o0 V. z' R7 b
( P' V! ?# G3 U9 B; K9 v private List<Integer> reverse(List<Integer> list) {
( L) M8 [- ^/ G List<Integer> rev = new ArrayList<>();
* q3 N; y) Z" K6 \: ^# o for (int i = list.size() - 1; i >= 0; i--) {! ?% v5 n1 Z" x1 C6 v2 R8 h
rev.add(list.get(i));
1 K% Q9 I) \+ U$ S- Q }8 G; E7 h' g- s, X3 O$ O, z0 r
return rev;
: ?" y6 C" {) r- g! ?. h7 k1 m }
; ^ J/ I# W, Q4 w6 [
! r3 J' R. P+ e2 b3 y* c3 a7 j! X4 v# R4 y7 q
private int gcd(int a, int b) {. ? i& j8 o& k. G
return b == 0 ? a : gcd(b, a % b);+ a1 \1 ]! T% V
}
0 K x% L) Z0 s: K} |