登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 转化时间需要的最少操作数】
% B# d3 q8 s$ b4 @1 k
: L& z$ }- T4 o' p$ K解题思路
) Y8 I' o9 F: J( K将时间转换为分钟数更有利于算术运算。
4 U$ m' Z. h" J6 V4 C% K6 ~5 a- J2 a. r5 P7 a
代码展示
/ n; N( l5 u$ `' a0 [# e# t- k. {; g! l7 g
class Solution {
9 T( V8 [/ k% p. S0 J; B: F! \ public int convertTime(String current, String correct) {
1 l: V" Z: t, G3 E1 G+ T int cur = toMinutes(current);
- Z$ C( K" i9 \" x& y: S7 u int cor = toMinutes(correct);$ ~) \" @3 e3 ^" R) q) R5 d" S
if (cor < cur) { // 第二天,将 cor 加 24 小时
6 d# w0 e9 ~- H, }. K: e( s; a cor += 24 * 60;
5 B* M& M+ L, m3 c' W/ E }
$ G' }8 L' e8 T( S: R' L% @ int diff = cor - cur;4 F( |* K, n5 q8 s
int cnt60 = diff / 60;
/ Q4 X7 Q+ t+ w* f) e6 B diff %= 60;
9 Z# @0 Z" E4 A int cnt15 = diff / 15;& [4 i& |( F$ a6 y b8 @
diff %= 15;
& |+ ?' [# T; S$ y int cnt5 = diff / 5;
1 F8 n% Q4 L6 K } diff %= 5;( B, |$ Y; F& T9 V$ D
return cnt60 + cnt15 + cnt5 + diff;
/ F& P' }! \, q/ [ }
" I+ G7 D$ t' Y! ~! x% \* y; `! l" l6 G# m. i- e! W6 x& i7 g4 W
private int toMinutes(String time) {9 F; V0 I6 I* C! Z# K% V& z
return Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));- L' w! ?( E- b5 N
}. q. T: B& o0 D" ~% P+ U& F3 y
}
% |9 N+ E2 [0 ~1 V* i! R# t& v. u; E3 f8 r2 X x2 O- @
- T) ]" v- S7 ]/ {1 e( b4 T【 NO.2 找出输掉零场或一场比赛的玩家】4 ^2 t% Z- V2 ^6 ?8 \5 a* l
' c( o9 V4 n' n
解题思路( M+ [5 ~* Q6 p* B1 c2 \( b. v0 ^
使用一个 Map 维护每个玩家输掉了几场比赛即可。5 H, z% s- s x$ ^1 [% c9 `) H) t
" j, g1 b! ?$ T% c8 V: a* @, N
代码展示, m( t" x9 _4 N! Q
1 g w( y1 g a7 h& d
class Solution {
# C9 }$ h1 D: I/ O) h1 {+ d& \7 G public List<List<Integer>> findWinners(int[][] matches) {* C; B: c# p6 ]( A
Map<Integer, Integer> loseCount = new HashMap<>();
, \2 T# m4 ]2 j2 Y7 d for (var m : matches) {
9 B4 ^% b$ i6 \# j* \ loseCount.put(m[1], loseCount.getOrDefault(m[1], 0) + 1);* U+ J# _/ c3 A W/ M: }5 O
}
2 W' R0 l/ W+ `. w3 W List<Integer> res1 = new ArrayList<>();
/ b2 g5 Q+ s; G& l8 K& V: Y8 G List<Integer> res2 = new ArrayList<>();/ N; `; n; l$ ?: x) }7 R
for (var m : matches) {
$ q% L: S6 H3 j8 w( U+ _ if (!loseCount.containsKey(m[0])) {
: n3 y5 X% I" V: D res1.add(m[0]);; n. U6 x" N1 L3 @% d) A
loseCount.put(m[0], 2); // avoid duplicates3 {5 Y# p, a2 |/ B/ p4 A9 g
}
$ d8 g2 b- B- O, f: }1 t$ G if (loseCount.getOrDefault(m[1], 0) == 1) {
! d6 e6 X6 b0 P; x9 i res2.add(m[1]);# M9 t- J! N7 X
loseCount.put(m[1], 2); // avoid duplicates
' M% b o/ L, u9 T; H0 a* x }
9 ^% s# }) y: t4 r }
& z- Y. w9 w: i3 O$ Q' [ Collections.sort(res1);4 I. D1 @( A: e; \" _1 u! t% r
Collections.sort(res2); c# e0 p7 V* h$ J" Z+ K* a
return List.of(res1, res2);. k& K; B' K5 E$ k
}
8 B6 l* E) Z6 T+ L}7 V+ {! `, \: u! }/ I5 T/ M# O: j
3 s& H8 k3 U4 q. b7 z/ Z( k
. h( K! P$ x! {【 NO.3 每个小孩最多能分到多少糖果】
\+ n. f# q3 r8 K7 s1 S" ^5 y9 j6 L5 [$ x1 p8 q
解题思路, y% [' O& H2 o: M: Q! ^- g. g$ |
典型的二分答案题目。; M& l& R- T) Y8 G2 ]- f$ `0 \$ u
% W( W9 c& S& c0 _' L" |代码展示
9 g8 `" I; f2 I! A7 b& N
3 O2 h+ Z$ o) L- H$ K- ]1 P ?8 [3 V, @8 `/ z* @
class Solution {' V( ]; D5 E- a7 {6 Q
public int maximumCandies(int[] candies, long k) {
, ]+ C8 k% `8 a* \2 H. R0 g int l = 0, r = Arrays.stream(candies).max().getAsInt();
Q. v; v. N% Y9 l. |& C! a0 w while (l + 1 < r) {
5 T8 b2 ]9 ~( S$ q& H/ }. [5 p int mid = (l + r) / 2;
& K0 l$ E5 N+ }: T. C6 L if (check(mid, candies, k)) {
" W7 q5 K. e0 W/ N; y+ C l = mid;
! i% r7 v7 l( k( |9 X# `2 F" | } else {
! u% ^; k5 N1 `9 Q! S4 j r = mid;7 }. z! a# K' s5 { P* j% H
}9 I3 o6 H- j7 |$ P: s
}6 J# G, t' z1 p6 f ^8 n
return check(r, candies, k) ? r : l;
; e: n) G+ X1 A( K }
* O7 }0 {1 o( I+ V( \8 ]
' t8 Y' m. D- O; j private boolean check(int r, int[] candies, long k) {1 S) @7 B) M* l) \) K7 I& H# O$ T
for (int c : candies) { {9 m) } N1 @! w& `
k -= c / r;
7 ^% i, Z+ @) Q' Q }) ?( \. x a e! b6 j- B
return k <= 0;
9 C9 Q9 y" A0 g8 Z6 E" d# z }, ^& I) \' `+ M0 [7 o
}+ y* `0 X, B1 A" l' h; D: ^
- |; B; z) Y' U# t- V1 ]
4 D4 h* h! r8 \ k4 i: y( y【 NO.4 加密解密字符串】: I" l) ]( R$ [& ~' ^, t* n
! H9 _* ?, q+ w( e
解题思路
# o1 g3 H; ? V6 |7 P使用 Map 储存 keys 和 values 的映射,即可完成加密。
0 ~$ {* j$ u4 y" F0 ]
( R/ j. l& Z: e; W: U" H; U# n6 i8 s. [1 r. [解密需要借助 Trie 树判断当前解密的字符串分支 (因为一个密文可能对应多种明文) 是否属于 dictionary5 u: f) I5 J/ `" j& [9 g: V# f
0 {2 T- ^3 u9 ^" A代码展示7 S# Z6 S; V% |0 x( N7 E
& W. o4 y/ \0 N) s6 e' C* uclass Encrypter {: ?" z% T2 }+ \- n& K9 e8 P
7 Q; ^# v; h' M% R8 l+ _ char[] keys;6 r& U1 [" P7 n/ q8 k( E
String[] values;
" M9 z$ _& y% d3 ~ String[] dictionary;
$ @" f) C9 a2 E, T! Q' G
5 s) H* X# J* a! J+ w$ R4 g7 L6 Z String[] keyToVal;
! L1 @: Y0 v7 C+ Z Map<String, List<Character>> valToKey;
/ i3 `6 y% w" f# g6 M3 Q# s Trie dictTrie;
& A# T+ N6 w! \4 i( N7 L5 [2 L0 J# h5 O
static class Trie {
0 J" L3 w9 x2 g3 a, e public Trie() {
# N$ h( E/ \( { root = new Trie.Node();
$ h+ J" o- ] K; c' K8 \ }: J& V8 s, v# A& o7 o2 a
9 u6 t# f# k8 g4 J/ d4 w public void add(String word) {& ]4 X9 `, ]! l
Trie.Node node = root;$ P E) T) O- D8 k/ f: ~, j/ o
for (var i : word.toCharArray()) {
3 i( Y% s6 d5 |* U# G7 a; ` if (!node.children.containsKey(i)) {
6 [6 s* S4 J" r* [- e) } node.children.put(i, new Trie.Node());
4 a% _2 f! R% |5 T' p( x& q8 ?+ S3 i }
* {5 c) i o& o; ?$ w* t: U! m node = node.children.get(i);4 o0 L, _6 w" }2 s; B- N3 u
} m/ R) l, j+ J+ Z9 K
node.isWord = true;9 z) V) U/ T+ c! _
}1 o$ a8 ^8 L, q: u$ U
1 h h; t8 v+ N4 K& [9 B5 W( ^: l
public boolean containsWord(String word) {: [2 q" h2 I. m* F" @; j
Trie.Node node = root;7 W( i: Z, B' @ s. I$ F8 d1 E) u4 F
for (var i : word.toCharArray()) {
* ^# d% |: z& h* d7 ] if (!node.children.containsKey(i)) {: ~$ Y: U( d S. L2 S' Y. o `
return false;
. K/ K* j& Z% c }% ^/ O6 p$ u' ^% q$ {" j+ h. X
node = node.children.get(i);
% ^, N, F, z8 T0 ^. d( M( X$ E( e9 i } L9 A" n0 r% Q @& W. a
return node.isWord;" Z) p7 i* C6 Y; l5 V
}
3 _! I& G4 v A) u$ B1 z) g8 \- e8 U+ [. j* C- u
public final Trie.Node root;
( }5 P7 u5 @) b% }4 |
Z! i! M3 F( ~! |: L static class Node {
6 y$ j8 q" o; k/ Y5 T9 b boolean isWord;1 g" d3 h1 H7 \# _: z
Map<Character, Trie.Node> children;* z' r* s5 ^; f9 _
) W! A; D$ X! ] public Node() {
8 r2 I; |" ]! T5 E& a) \% M this.isWord = false;
8 N% x) a1 @" p' ^( {- B8 {& X this.children = new HashMap<>();
& ^( {* P r5 F4 S+ ?" @ }
4 z5 g6 s, k' S* M, [! b7 Q* E }
) }3 e3 P0 ~7 t# }0 I) e- ?4 T, @ }3 l/ g: U1 H( p4 T9 |# [ ?, d
/ X1 b' W6 \4 n w/ }: S- v8 g3 V$ g/ y9 Z
public Encrypter(char[] keys, String[] values, String[] dictionary) {
1 `% m; f' v8 S8 [9 R this.keys = keys;! X* g) o( ]* ^( ^4 F
this.values = values;' ]. I+ i' N. d1 o3 w
this.dictionary = dictionary;
' C, p0 b: J- l3 L1 a4 a keyToVal = new String[26];
; {2 I2 W7 o* y; X# E valToKey = new HashMap<>();
6 ^) l* V# r& s7 o# K- e/ g for (int i = 0; i < keys.length; i++) {
: f( {/ ^( E( W7 ~$ B4 J5 p/ Y% ] keyToVal[keys[i] - 'a'] = values[i];% J8 j1 y8 c+ \' S( J1 m( y
if (!valToKey.containsKey(values[i])) {
! S) H+ A+ V, F/ l- d- O2 M# V valToKey.put(values[i], new ArrayList<>());
9 o( _+ U+ `* s }
$ @( M8 u$ q5 G: I3 z valToKey.get(values[i]).add(keys[i]);7 F! ]' `5 d) g5 n1 l
}" t9 O* w$ _, m1 i0 q
dictTrie = new Trie();" ]. w/ {2 u: I3 h: R
for (String s : dictionary) {
8 q2 A }* f& K4 }" y1 N dictTrie.add(s);$ Q- s' k; f7 @( ~4 b; C6 G( f
}
2 `+ r* y4 J* Q; _5 | }: l6 a! K- v. e" y" I. h
: N: s- @9 C) {/ q; O! ^ public String encrypt(String word1) {- r% ?9 G9 @- I1 }4 C6 y0 \; ^* r
StringBuilder builder = new StringBuilder();
/ v+ S. J( K* g. ?& ?" Z$ ~ for (int i = 0; i < word1.length(); i++) {
- r* a$ {7 o0 t G" X. E: o- g builder.append(keyToVal[word1.charAt(i) - 'a']);3 E* I+ o3 {: k: P
}
# r, B- z( @4 B" K( V9 I0 P0 S return builder.toString();
' Z! m( A! h3 v) b& l: n+ l5 n. F }
& R' b! @' E& q/ Z1 ?+ {' g( y4 ~7 r. t) E
public int decrypt(String word2) {' C5 R! N E% {! w
return decrypt(word2, dictTrie.root);
% f' a2 W4 O, R# M% R. f }, t" u) Y9 q/ W$ N3 `- d- ^
9 D6 A+ d5 j: p' O$ H) T5 e final private List<Character> emptyList = new ArrayList<>();
/ V/ u: N. C& i3 v
: k; `/ f/ C. P! d7 w; y1 }# |" x private int decrypt(String word2, Trie.Node node) {
' l9 j0 h* y+ D+ a ~ if (word2.length() == 0) {4 K& f' d* T0 ~/ ? ~- @
return node.isWord ? 1 : 0;
. `2 x4 X0 d, I7 L }/ s: Z$ y* n7 V. o
if (!valToKey.containsKey(word2.substring(0, 2))) {# r5 b2 o/ g# ]: F5 A" x
return 0;# }/ J0 s3 f6 f/ D5 S: q
}
/ S1 @6 ~2 T/ D% p- S var cand = valToKey.get(word2.substring(0, 2));
6 Z- P! q8 T6 F8 O: n int res = 0;& ]! h' |8 Y# Z! a1 j
for (var c : cand) {8 ]. N' v, \/ D* e/ I
if (node.children.containsKey(c)) {$ g0 Q8 e: @3 V4 v: {) p Z) L
res += decrypt(word2.substring(2), node.children.get(c));
0 z) ~+ j' O* u- `" g" U/ | }0 x( r4 _, \" P/ G
}$ L- d% C4 A7 u: {6 D
return res;
: S( h3 w9 O) J% e }
% ]! a! Z% K# S" g} |