登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 转化时间需要的最少操作数】
8 g# ], b1 U5 n* N4 n7 S% h
# E7 E# h0 M- Y; ~! I, u解题思路
3 C/ w/ [: r0 D6 t将时间转换为分钟数更有利于算术运算。
' W2 |3 v8 H, F" h
. ]$ d1 S* K2 X9 e代码展示
1 r* x3 h; z7 Q3 W+ p+ l1 N
0 l) N, k+ J H' q, [& ?class Solution {2 U: l5 q! `! p. T
public int convertTime(String current, String correct) {
' z6 u: f; u0 a9 Z9 Y int cur = toMinutes(current);1 a. p& [1 L$ L5 R; }6 T9 |
int cor = toMinutes(correct);- N9 o |: U, d6 e
if (cor < cur) { // 第二天,将 cor 加 24 小时
- Q7 q2 q+ y2 r% x3 r cor += 24 * 60;! j' J5 @& `) t8 d6 E' ]
}0 g8 @6 x9 C4 z$ _& h7 I
int diff = cor - cur;% B7 w, _' v- m8 g3 n Z* Y7 X
int cnt60 = diff / 60;' J& y5 ~* W; L! {8 t6 |2 p7 p$ Q
diff %= 60;
* f& K3 m5 q9 k' q$ U& m int cnt15 = diff / 15;
. v# ^% y' Y; _+ O. r diff %= 15;
$ z/ e+ [6 A, u4 r0 P int cnt5 = diff / 5;4 j! ?# v/ Z/ V2 R
diff %= 5;
* k. X7 O5 n1 J& W6 B return cnt60 + cnt15 + cnt5 + diff;) Z/ U" v1 `/ m9 N* ? |* v" J
}
* I% s0 w+ }6 f# y) y0 a/ b* w9 t2 r. x0 f! k- V
private int toMinutes(String time) {/ q0 |5 _" m7 B) L9 S+ {
return Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));
6 O$ X0 O- w" r, c }
5 j' F% e6 S8 z R0 I}
7 T2 {$ G) z( P- Z8 a$ A7 c4 i
4 P7 d3 n* R: E+ K, q( `
) q5 t, I, D, O& h【 NO.2 找出输掉零场或一场比赛的玩家】# t. I& V3 O# L* H, h
3 P* D2 G5 y* j+ E- Y. M m0 u
解题思路
& k% ^" `! W1 J/ Y2 r) q使用一个 Map 维护每个玩家输掉了几场比赛即可。
3 v) ~6 G- R1 D3 Y8 z' ]& k8 ]# z @- B6 @: R
代码展示
, E% p3 K& @- _/ R7 o
, Z( o- ^6 I: v" d$ Dclass Solution {, t5 m3 r/ U; N# E/ F. H
public List<List<Integer>> findWinners(int[][] matches) {
/ F) A- b; z3 l! @3 R3 I2 n Map<Integer, Integer> loseCount = new HashMap<>();
, [% `, W- q f for (var m : matches) {/ ^3 s' a3 W+ k' K6 d
loseCount.put(m[1], loseCount.getOrDefault(m[1], 0) + 1);
# H4 W0 R/ N, e* u& O1 d. v }9 J0 q( x1 ?* z; T# n# Q/ F
List<Integer> res1 = new ArrayList<>();2 M+ v7 z8 P1 h' U1 ~+ |
List<Integer> res2 = new ArrayList<>();
: P: j& s# B* T* O" K for (var m : matches) {: r$ v* Z! I7 W F# J0 L5 Q
if (!loseCount.containsKey(m[0])) {, v! S1 S5 U# D8 j9 ]5 q+ j
res1.add(m[0]);% \7 ?. @0 i+ R# ]& c8 r4 A8 u
loseCount.put(m[0], 2); // avoid duplicates g& n3 N( o# P% {! o7 {% _
}2 Y0 M) I7 E% H& O
if (loseCount.getOrDefault(m[1], 0) == 1) {, ~/ \& v8 T+ n' q# O
res2.add(m[1]);
. R* U9 k; Z3 s, }, P* p! S loseCount.put(m[1], 2); // avoid duplicates/ M, J$ |0 v; Y- q: ]
}& h2 N0 e2 N! n, g( p4 l0 O3 T2 Z( i& ^
}9 x, j# V* l, ^, a/ T: W
Collections.sort(res1);- F0 b6 ~ F/ P7 Z1 b
Collections.sort(res2);
3 y/ J0 d; j/ p- v6 y) Z9 U6 m return List.of(res1, res2);! s1 k* Z5 d$ M; e6 R4 e. R
}
( \- S$ y5 r3 T% {4 K4 m7 {- C}! @% C* u& M/ [; _
1 ?. G) u+ U: u! U7 L8 L6 S- k( m0 R
7 ]" `6 _/ D% y4 _$ m; m【 NO.3 每个小孩最多能分到多少糖果】
; A) z* H/ Q/ H0 p! v/ K5 p# u# z# N
解题思路0 A" ]1 N1 w& d4 ^" o: b7 `4 z9 S7 D
典型的二分答案题目。; n+ S1 s' ~' T2 Y3 F& y6 x- y
4 l4 \0 D' E2 l$ ] W( X代码展示
2 y! X. ^6 }1 c U0 i2 c+ T# R: M# m; @
# e5 o7 f7 J z( T9 h
class Solution {! Y' C4 |: Z" [% y) [+ I# K( V5 H
public int maximumCandies(int[] candies, long k) {. ?+ W5 I+ z5 Y* f" D, s
int l = 0, r = Arrays.stream(candies).max().getAsInt();
( f) ?8 ?+ C( w2 _4 Y% U7 Q5 e- B8 E while (l + 1 < r) {
! J$ \) V; d1 A int mid = (l + r) / 2;
1 `9 V$ J1 r1 k3 B% v1 m$ O) [7 x$ l" c if (check(mid, candies, k)) {% Y" ]3 l4 }1 K# _1 K
l = mid;
& E$ T H. n3 B } else {! Z4 h( W. b5 C
r = mid;
; @4 J; T2 W: i' l }! E# R! L: f$ A
}" _* n# [6 f4 C4 L2 n( {$ C! p5 x
return check(r, candies, k) ? r : l;; V' D o( t8 o1 {! g
}2 ?# n; j/ b) J4 l, w. z$ j
) j% t {1 ~4 q' \0 \! z- o, I
private boolean check(int r, int[] candies, long k) {. |! Y' c% ?7 F3 U4 p2 R
for (int c : candies) {
; {. | G/ m3 V9 Q# |" `: P k -= c / r;( m. C* V1 C$ ]# O- B( u
}7 J" ~: Q# f6 C2 X* s
return k <= 0;
5 n# \# @/ G7 U ?* B; @ }
; ^: w, Y9 p2 c& G( U) {1 p$ J}
$ b$ u3 L2 q B& j |. t
. P+ o. [5 w- L3 S/ G: z! G4 t
( O b {! m5 l l【 NO.4 加密解密字符串】9 L) [4 c' k; c" O" ?2 r. l
- w" {2 v* w1 x r
解题思路0 Q0 r. h* T7 l. Q2 J
使用 Map 储存 keys 和 values 的映射,即可完成加密。
/ |: |$ U6 ]" `* v, s7 `
1 L7 T' N$ j" d: N( i; U8 S解密需要借助 Trie 树判断当前解密的字符串分支 (因为一个密文可能对应多种明文) 是否属于 dictionary$ `' W, v6 |' h$ Q
1 l4 ]% T( z. P
代码展示 [8 {. N; X8 D) ]& [0 j! x
4 ?5 b: I5 e. `; m! [' }9 qclass Encrypter {
( O/ x; T$ k0 h! ]" d' g7 p/ H/ M7 m, w. W; d$ Z9 D
char[] keys;
3 S7 F, ^: K: H) E; i' x String[] values;0 {' M. ]' t- Q) y7 L8 u, G
String[] dictionary;* |- ]$ @9 R' b0 S; L
" H4 E* A8 G% ~9 y4 R8 Q
String[] keyToVal;
' K( z$ ?( Y9 i# i) a- s Map<String, List<Character>> valToKey;
( c! X' O* h* q! g) _ Trie dictTrie; C% I6 x h, {
+ a7 }' y) Q+ }) t9 N* Y; `6 f8 ^. E
static class Trie {. Z+ G j3 L% W- o! b- J
public Trie() {
7 b8 n( @5 T: w% A, V h. l0 l root = new Trie.Node();
" w* }2 K) z& l* n, N# { }
% U7 o3 s8 U/ n6 ~ M* h; \/ P; q: U& R% a; e) g5 c! B
public void add(String word) {. B) G X, x; u4 ~) \; ?1 ]! q+ B: G
Trie.Node node = root;/ p, F) W0 R9 l# n2 m
for (var i : word.toCharArray()) {
. g8 C( B* C; n0 [* ?, M$ E if (!node.children.containsKey(i)) {
, d0 w' n; z, ~! w1 B node.children.put(i, new Trie.Node());
/ W! N9 Y8 @$ c* N v$ D8 ] }# p2 N$ p3 y+ Z# \! r$ K, _
node = node.children.get(i);" L. Y" f* B1 E3 z+ ~# o7 V
}
! B# [0 [( Y, i) [2 O1 ?% C: A node.isWord = true;
' r4 D* ~) M1 \( y: \+ H- W } a' q7 F; ?; B3 \/ D
5 ~' [+ k3 B) p5 \1 v! _" Y public boolean containsWord(String word) {' [7 y) n% }; B- `5 a; @
Trie.Node node = root;" N1 O; [ ]% F6 r( d0 F% F
for (var i : word.toCharArray()) {7 Z' V& w6 J) l q5 @9 q2 v
if (!node.children.containsKey(i)) {
5 [9 s0 d4 K; W: n# w6 g0 E return false;1 k r* u g$ C2 C
}
# z' W N' \+ [( z6 H0 A node = node.children.get(i);
9 S! v' S" C/ l/ e }* T9 ^% F6 Y5 H+ n
return node.isWord;
* X5 J: o5 h$ h8 T }
4 B' G# H8 @$ C8 V, z7 L% ]6 C
7 D4 p6 O7 P) m8 `0 a8 N/ q' a: @: J! f public final Trie.Node root;& M1 E6 D& _3 w- b6 s% {9 F
+ O' ?. k& e5 s0 C& ?% r" V2 S* e static class Node {
5 `8 s# O% J; w" u' F, S boolean isWord;' W5 v! m5 d. B
Map<Character, Trie.Node> children;( T$ @, y! t6 _1 c
* J$ p+ \8 j2 G
public Node() {) R3 w) }5 S4 e+ K' |
this.isWord = false;7 c5 ?7 v0 P% K# a4 ]" }" M- P& K9 i
this.children = new HashMap<>();
0 B$ T9 n p$ t }$ M- |; D) @) {' Y5 `% ]
}
4 z- V2 J/ y; U5 |4 y$ Y6 c7 L( L }
8 m# G6 i8 ]# O' I I Q
: e# [) S$ u( O" a( N# [ public Encrypter(char[] keys, String[] values, String[] dictionary) {$ r6 q {- ?+ T1 s
this.keys = keys;7 @" q0 d" C- d5 M( \
this.values = values;% M5 P: N: h8 z5 y8 c
this.dictionary = dictionary;- O, N; j d# }3 L" M: Y# w
keyToVal = new String[26];6 {1 \3 p+ t$ I8 K6 z9 t3 \" ]/ i u
valToKey = new HashMap<>();3 ^8 J' G2 Z/ K1 o
for (int i = 0; i < keys.length; i++) {
$ F$ f$ K! P' T7 E0 F keyToVal[keys[i] - 'a'] = values[i];7 p3 B% j" J* ~. X# v+ q8 C
if (!valToKey.containsKey(values[i])) {' d* l1 y0 V# L
valToKey.put(values[i], new ArrayList<>());3 y& X0 ^3 k% U, z/ p# C6 q3 m# N
}' g* {" ?8 H1 E
valToKey.get(values[i]).add(keys[i]);
8 n G# h2 i. W. X! v }
0 K O3 ?5 V- X% P+ J' w9 ] dictTrie = new Trie();! R* t: P, w" o8 }2 k6 }
for (String s : dictionary) {1 ^) a6 n6 H2 a$ c
dictTrie.add(s);3 x) d: D8 V/ W$ n8 n7 B
}5 V5 e! Z# z V+ |- {3 L) m$ ] g
}) I9 X8 q% }+ g2 M5 o
G7 G4 }3 X: Y. Q/ @0 } public String encrypt(String word1) {! u1 R( E6 i* L0 W
StringBuilder builder = new StringBuilder();
# C6 I, s/ K0 v/ r, i2 o for (int i = 0; i < word1.length(); i++) {8 Z) y$ j7 @% U# a. T8 N# A9 q
builder.append(keyToVal[word1.charAt(i) - 'a']);9 y. Z% ^/ ]. s+ w' \: G$ J; ?
}: t! T2 T, }4 G4 \; [' B2 G& m _
return builder.toString();- F; `* {; L; e2 Z/ W3 |
}
$ ~& N' r/ a. J a# w% e4 `' z- @: t$ F5 ~! F; d/ v g8 C2 u
public int decrypt(String word2) {7 C; d$ c P5 Z1 `8 f4 T2 E
return decrypt(word2, dictTrie.root);1 v/ w/ G) [; e" _
}
) G+ ^. s1 H3 e( A2 Q4 _& c1 X4 W6 C, C3 d- d6 G
final private List<Character> emptyList = new ArrayList<>();
6 m& q( i) r. J, D% w- C8 {
; \% z: }/ Z, Y" h private int decrypt(String word2, Trie.Node node) {
# w8 |* Z: X, ^) D if (word2.length() == 0) {
( D- N$ c% A7 I0 Q# w9 C return node.isWord ? 1 : 0;
0 J2 L6 j. o5 x% ~! k }
* k- X( f4 k) H if (!valToKey.containsKey(word2.substring(0, 2))) {
4 J* l/ T! j' A& r* c! R return 0;
# C( E; X8 y4 W7 F: P }
% m* J+ M4 o P+ O9 }" G/ O/ H var cand = valToKey.get(word2.substring(0, 2));! J* c8 W9 F9 S4 v8 b2 ~
int res = 0;
' e S2 h1 O% O4 P for (var c : cand) {
" B7 \0 ]5 u/ R5 y if (node.children.containsKey(c)) {4 q6 w" e3 L# x- |3 M/ C4 H" f7 w
res += decrypt(word2.substring(2), node.children.get(c));7 R0 W* t y5 ^3 j* I/ m
}( a' c2 \) ?* [( |3 G
}
: w" F0 ~9 `, e( E5 d return res;3 A: o. a! k: l$ [
}
$ ~* a# ^9 x1 O: d& @4 \} |