登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 转化时间需要的最少操作数】- u3 o2 {- S) a6 {
; M; Z% r- ^, c: C+ Q解题思路" R* |! o. Y8 N1 B( J5 h* f F6 e
将时间转换为分钟数更有利于算术运算。1 K0 z7 \7 S1 t/ S7 y' I5 ^# ]
2 A m `+ c( m1 u代码展示
( f- }$ Y( v' L% e
6 e( a# E9 G$ @' n- q- xclass Solution {8 l% r5 o- z4 `" |
public int convertTime(String current, String correct) {5 Q7 w4 s$ u g/ x2 V4 |
int cur = toMinutes(current);
/ H+ d2 n+ l' T int cor = toMinutes(correct); v# T$ c2 e' _ x& P9 s+ p# a
if (cor < cur) { // 第二天,将 cor 加 24 小时7 S: @% H# q/ \3 P& _* g
cor += 24 * 60;
4 T: v, J9 q6 F* T( N. w- v% E }4 H# C6 H2 G: j1 m( m/ V& C0 W
int diff = cor - cur; w: P# \. z* d# c8 p
int cnt60 = diff / 60;$ |0 n' ~5 O ]: E7 {3 Q" e
diff %= 60;- k9 d& h+ y- g" X v. z5 L1 y
int cnt15 = diff / 15;+ _5 {$ `' `. S" N) a
diff %= 15;
' {5 q$ j% j3 b" I int cnt5 = diff / 5; Z+ H" s) ]3 w" Z6 D
diff %= 5;3 k6 U4 K8 K+ j
return cnt60 + cnt15 + cnt5 + diff;
p4 C; s$ P& u6 u& L! V$ c }3 o7 o2 w/ C( |. m4 T
* V) Z+ [% B1 N2 X& t* T% } private int toMinutes(String time) {
0 d4 e9 q- d7 A- g7 s8 m return Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));, u% v; A+ X4 f
}( d1 ^" Y/ b1 V% u6 ?; b: p d6 B
}
, Q+ V4 h* J2 i+ L a2 f4 |# ~% K; E: ^9 E" G$ K1 |
" D' C- O1 K( v
【 NO.2 找出输掉零场或一场比赛的玩家】
5 f* w. Q' [% H# _) B2 R0 X7 K" @5 x
解题思路5 [) B& N# ?% ~; P' l# a
使用一个 Map 维护每个玩家输掉了几场比赛即可。+ v2 s' g2 {* r4 C
5 `% B; _+ w3 H1 _% a6 s ^& a x代码展示
# {% s- S4 T5 I( n- Q' X; [5 U; |& h, k r1 O0 x* C- @2 b6 E
class Solution {( z& n e$ e8 a! p2 G* P
public List<List<Integer>> findWinners(int[][] matches) {" ~' b1 t+ E* R# g& ?" D! D
Map<Integer, Integer> loseCount = new HashMap<>();
' O5 U) b* \5 N( A8 [3 p' w& M& J for (var m : matches) {; t: A! ?' |& \
loseCount.put(m[1], loseCount.getOrDefault(m[1], 0) + 1);% D. S7 D& B1 x7 O4 [8 H
}
c/ X) A; L' T* ?4 e: B List<Integer> res1 = new ArrayList<>();; b; N( }7 n6 ?3 S) J# m# o
List<Integer> res2 = new ArrayList<>();
( p' _! W# \# C+ @7 S) Q, ? for (var m : matches) {4 \" w( s* _1 m' D& ^5 a
if (!loseCount.containsKey(m[0])) {; o$ q+ m# a: J
res1.add(m[0]);6 M3 ]4 k) @) w+ l' f
loseCount.put(m[0], 2); // avoid duplicates
9 t/ M% h1 ^! K2 Z! X! k) Y }
' a6 W, [% N7 ]1 ~ if (loseCount.getOrDefault(m[1], 0) == 1) {
1 N# \, `) }" o( f: F9 n% A res2.add(m[1]);& U! O, O }2 Z8 q4 @# |7 \- ~
loseCount.put(m[1], 2); // avoid duplicates
z7 ^2 H3 N' E0 N: Y }9 S+ ] G8 n! t2 z
} s; ^6 x. z5 b! j0 A3 Y
Collections.sort(res1);
! J* T5 T5 z3 q. E) h Collections.sort(res2);+ W4 ^4 Y" @; K/ N" F( y
return List.of(res1, res2);$ I8 h- b7 p& w% h [9 p7 l) i; ^
}
' V \5 `7 z @& V" x, t& r# k}! f, @, V* K) L6 ^3 Z' j2 M5 e M% S* a
, P& P- a. T2 @7 z
- w7 q: s4 y( A5 J3 W
【 NO.3 每个小孩最多能分到多少糖果】
' G2 O; ?9 I+ v2 t! j6 ^) ^! b. D/ O8 u4 Y% C! l3 ]7 ]. W
解题思路; e5 l# T# x* @/ |
典型的二分答案题目。0 m0 D% X$ Q. @$ x( h" U5 c/ a
9 ]# B ?7 \3 G: v- B s" s3 P代码展示
) t6 E# C8 E4 r1 \1 g4 X$ f0 ]
6 L9 [4 @# N |# o& N, A+ _3 o( ~
class Solution {& K* n5 u+ V/ S: r
public int maximumCandies(int[] candies, long k) {7 B+ T. v0 d/ i, a" ?8 Y
int l = 0, r = Arrays.stream(candies).max().getAsInt();$ T; O- l/ [. ]* y. E1 f8 `
while (l + 1 < r) {
~, P& i- T9 {9 T& ]) e: | int mid = (l + r) / 2;
' t% j; w8 j, }7 v7 Q& D/ M4 \% e [; G if (check(mid, candies, k)) {2 p( d+ C' g4 a9 R; ^ d1 r
l = mid;* K' Q6 [2 \5 _- S# I
} else {$ G) ^$ H8 B, z$ _8 i
r = mid;* N H# a) {3 j
} z$ \ E: W8 c+ O
}
8 c4 W! c% A/ n% A( f return check(r, candies, k) ? r : l;' a% D/ ^5 n; |# G1 Z0 ~
}# D' H! {8 K$ y/ y1 ?( |; Y
8 d! m6 e/ X- | {" c5 R
private boolean check(int r, int[] candies, long k) {
) a9 n: k1 W3 L, `. a for (int c : candies) {
) Q$ I" r7 ]* p9 R0 o2 ?6 e k -= c / r;
: f5 k+ z' f) D6 N7 k }# {/ s# b7 X/ q# E# K, Z2 Q
return k <= 0;
0 b: p: x1 o' s9 a3 ~3 k& u }
0 F$ m* a, Z( j/ c6 r}; w# V% h5 k! O
, l( _* V0 f: y( l- `
/ z% W5 v$ e8 F6 t【 NO.4 加密解密字符串】9 U# D I r& D! i$ {' W) k
/ D' B" A3 o) K9 }0 V# y
解题思路
7 {1 D, a/ n" A3 g使用 Map 储存 keys 和 values 的映射,即可完成加密。
2 Q: x0 B. Z& D" _" O' B8 }- { [' @* `1 p
解密需要借助 Trie 树判断当前解密的字符串分支 (因为一个密文可能对应多种明文) 是否属于 dictionary0 E( i$ [# B' ^9 |3 J
0 Q4 S5 C& w+ i4 s' P: @
代码展示
9 N! T: D6 N, J8 W5 t5 r+ w
3 a# N7 k6 j1 U- J6 ]1 Fclass Encrypter {
! j: H; R) Z% h6 d, V- u- n6 G- v+ A2 E" X8 _3 H
char[] keys;
4 j% h5 r9 M/ b String[] values;/ Z& H3 @6 |$ q( K8 u' {7 P
String[] dictionary;
9 m y1 U3 }* ?6 L$ W: {2 I
4 k* i. i& s" F! d6 k String[] keyToVal;- U& p# Q, ]! K" r# A) x" ^2 H, O
Map<String, List<Character>> valToKey;
2 R1 c, R: m$ t0 N! |% t Trie dictTrie;
5 i- ^; x6 w% |6 Q/ L3 ~8 n# |$ S$ ~ M* o8 B0 h1 X
static class Trie {
" q9 t% e' q, _, ~1 k public Trie() {" p" m8 t! o/ D" p0 ~! I T
root = new Trie.Node();
, O$ z# k( ]( e: h4 d }
' x% g6 M" _# }
9 o! K. m6 H1 m/ Q4 G! S public void add(String word) {
: C( p+ W7 j* V/ N Trie.Node node = root;
, y( `- u: U# R+ {5 W) Z for (var i : word.toCharArray()) {7 \! e0 M+ _ H! g \* \; k9 p
if (!node.children.containsKey(i)) {
- y0 J6 n; z% _' O8 |6 ] node.children.put(i, new Trie.Node());7 _: x: ?8 ^1 |, ?; l# V
}. ~/ r: [! h' s! Y
node = node.children.get(i);
) H0 s2 }% r* v2 ~ }& s! k! V( |5 X2 |+ f. Q
node.isWord = true;% n% g& o0 O6 J/ W' q2 U
}0 T7 O. n% l- Q, q: J0 v
1 k$ t* \0 F0 C
public boolean containsWord(String word) {( h8 n x y9 t4 P7 n
Trie.Node node = root;
) Y2 o9 y* q, h3 v8 s for (var i : word.toCharArray()) {% C* I8 U! C* x' G& @9 i
if (!node.children.containsKey(i)) {
- l$ o) g1 x5 E( r return false;
+ E5 m& T9 V9 J. C; c }
* f, {, h8 K4 g8 X3 @ node = node.children.get(i);
H# K X) \, H3 s }, D$ Z- F$ b. g6 U5 q
return node.isWord;7 R1 p) r1 u& x6 A9 C" ? G
}. p) X4 P. t2 D/ f
; w7 B+ c1 l& [3 A5 ~ public final Trie.Node root;
( u; Y# [. a) @ c# ]
1 y# k* E! H7 F static class Node {
( A: f/ ^/ Y5 L! |: O boolean isWord;, c8 Y) `) x9 f N9 r) i5 A
Map<Character, Trie.Node> children;
( P$ U& |+ Y u- R: j& l% n) U1 }7 O
public Node() {2 ?8 m- N9 f* s, q4 P) k
this.isWord = false;
, [- }7 Y7 V$ I8 N6 K0 z" J6 m this.children = new HashMap<>();) P! ]& R% h9 F0 E- h
}3 t! R( t( P5 t- C6 l
}; Y1 J. b3 ?* N7 f3 y) A
}
1 Y9 A4 C% i" X# M
4 Q7 e8 h9 v T/ C public Encrypter(char[] keys, String[] values, String[] dictionary) {" J! C6 V6 K4 `( ]. B5 f
this.keys = keys;3 \! V9 Q2 H9 W0 V/ k
this.values = values; ^+ i( N; L& h. N1 C' [, @
this.dictionary = dictionary;
4 P3 M. ?$ |4 K6 R* v keyToVal = new String[26];
# U ?& B" Q }% x/ y valToKey = new HashMap<>();
' F, _ H8 }* O1 \- q for (int i = 0; i < keys.length; i++) {
5 f8 \9 ?2 W l) Q/ P# v5 x keyToVal[keys[i] - 'a'] = values[i];0 U/ J+ {) e, l- S
if (!valToKey.containsKey(values[i])) {
* \% F3 ^$ W3 w% p9 t valToKey.put(values[i], new ArrayList<>()); k1 a: @4 \6 r7 e/ S
}
. s% l% i( ~* C( ~. L" ]# Y2 w3 j valToKey.get(values[i]).add(keys[i]);& K+ _ w0 E. x4 a d+ [3 K' s1 D# U
}
" U) v5 C9 T, o dictTrie = new Trie();
# A# s1 e6 J6 W7 B for (String s : dictionary) {
, I% S3 F! S1 \% D& L/ s. Z0 V dictTrie.add(s);
* h1 `3 Z3 {# @ ^6 }$ a$ c }3 A. a8 t; a( U& {6 R
}
+ T+ n9 p9 d; Y2 }+ m& {/ L5 e* O6 Z% b
public String encrypt(String word1) {* M) t& l. _2 W# _
StringBuilder builder = new StringBuilder();
% p) Z, t& u( h7 I, | for (int i = 0; i < word1.length(); i++) {
/ w& B0 o3 A/ c% @9 Y* L) w builder.append(keyToVal[word1.charAt(i) - 'a']);9 \( c& p9 Y. y) b, R
}
3 w9 y* `3 t, g7 H: x return builder.toString();
- L4 z8 _- e1 O. ]0 n }
. B; i/ c- U# B
5 d. ^6 o$ @4 Q/ l- _( ^2 S$ c public int decrypt(String word2) {
7 Q1 D* a/ D& M" G0 \; ^; X return decrypt(word2, dictTrie.root);9 ?5 f5 |0 Z6 i0 u) z, {
}
/ a8 S2 e$ V# b+ G0 N$ y& p; E8 ~6 E5 L- o. b6 X+ A9 C- ~
final private List<Character> emptyList = new ArrayList<>();
) m% a! Z7 G; Y9 y, i- T
7 F9 u' f* Z1 A% o0 L# u0 W private int decrypt(String word2, Trie.Node node) {
M5 r, g9 n7 B) I d if (word2.length() == 0) { j- A3 e8 u N5 V
return node.isWord ? 1 : 0;( F0 Z n0 @" G
} q9 N3 K$ Z; i. ^& Y* I# |& u
if (!valToKey.containsKey(word2.substring(0, 2))) {# `1 f4 w) c' c% f6 i3 Z, s: u& Z* M
return 0;
- I# p* h+ {% c/ j* s& m }4 j2 v1 D9 o$ M% S l" T ]4 @$ N
var cand = valToKey.get(word2.substring(0, 2));
6 d- w# [5 |) S- L$ Q& S' r int res = 0;$ L7 W8 \7 ~9 {% p m; H
for (var c : cand) {$ k2 U6 t u3 R# g# t4 k
if (node.children.containsKey(c)) {
6 S/ V. [' u% l& l) k5 h4 l res += decrypt(word2.substring(2), node.children.get(c));5 N+ B& ~% I- b3 L7 v" P: C( j
}6 g4 r9 w: l' c
}
F* e; l; e+ ?3 ? return res;
9 R+ l- C. v s' ?& m$ I0 e }$ }5 y" n, `: b" \8 Z7 ~0 |# {4 I
} |