登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 转化时间需要的最少操作数】
9 k) s/ J0 Z) j+ @
1 c0 R9 z( p5 V5 u0 A解题思路
' C' N- \' @$ ]3 S' _2 y& @将时间转换为分钟数更有利于算术运算。
! s/ F! H" Y) c* o( D; C( }4 o0 V
代码展示$ c# f Y X) Q1 B
7 ~4 h' G8 @5 R8 I) P
class Solution {
2 A6 `2 P( i" P5 L' u2 f( Q2 t" O public int convertTime(String current, String correct) {
8 y) |8 s ~6 U0 I' |% b* Q int cur = toMinutes(current);
$ ^! x1 Z; A1 d int cor = toMinutes(correct);
- y7 W# T; _: a) c# e! l if (cor < cur) { // 第二天,将 cor 加 24 小时& j+ o9 }. c5 B. x' v& P
cor += 24 * 60;
. y+ @/ J4 p9 N# I' O, F2 p1 q }
7 V' f! o; S; n9 V) J int diff = cor - cur;: i+ L8 s$ V- O* c+ D
int cnt60 = diff / 60;
- ^! Z& w8 ?8 g3 ?( Y5 y# f. I diff %= 60;5 P6 W- C! S, l" [7 I: N
int cnt15 = diff / 15;
9 {: ? w% z5 U; A9 B# M diff %= 15;
! G a+ Q: G7 i5 ?1 F3 @" k. A int cnt5 = diff / 5;
/ R, d6 @/ a: Q) ^ diff %= 5;% _+ G& H& `5 n( s7 Z3 r+ ^7 F
return cnt60 + cnt15 + cnt5 + diff;' _2 s! o6 l4 L( r" |
}
8 I) X$ U8 u1 j! O4 B, M: H1 A X9 W0 V0 v, U! v' b4 L
private int toMinutes(String time) {: H. n! V' E" f
return Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));* b8 Q& \) @$ ^3 N* `# k0 u2 A# p
}
9 E- `2 ^8 }% W8 y/ `}1 C" z0 k% T% W9 z* x9 e5 w1 }
% |# F, W5 K% c- ^! V) P
4 c7 D- p! @; y* y+ J
【 NO.2 找出输掉零场或一场比赛的玩家】. Y2 x9 |& y5 |9 \3 g6 M, K
9 ^6 ?1 ^8 _9 R- H8 @( g3 _) g, j解题思路
v+ _$ f' f# p" F. T$ A- j使用一个 Map 维护每个玩家输掉了几场比赛即可。" [; t9 o4 t" J9 J" g6 S5 ?
/ P% `" m0 `7 N& `% d1 E
代码展示
n5 I5 ?; K& d0 J c; A
$ I+ e7 \: v& ?8 Dclass Solution {& T+ d4 h6 t. i% a" p l9 G
public List<List<Integer>> findWinners(int[][] matches) {0 K6 }- _1 F1 t# L( H
Map<Integer, Integer> loseCount = new HashMap<>();
5 r" W9 ?5 x# n6 q for (var m : matches) {
- h% g0 a! I$ } y* I) v: G0 O loseCount.put(m[1], loseCount.getOrDefault(m[1], 0) + 1);0 }+ B$ F, n/ \! d i. Z+ Q! R
}" u: ?( y! R- V- v
List<Integer> res1 = new ArrayList<>();
/ S2 h5 F z+ L& N4 p6 I4 F& j List<Integer> res2 = new ArrayList<>();
! C5 h# K( Z3 `8 S for (var m : matches) {
& p j. U% Z1 \7 I if (!loseCount.containsKey(m[0])) {
9 J: E$ F4 V. Q8 \$ m res1.add(m[0]);
( M* @+ d t7 f3 I& _ loseCount.put(m[0], 2); // avoid duplicates7 {" c% h" P7 j* p3 E) h: k3 `6 x
}
/ A( b& Q$ T% F' Q: w, z, x4 Q if (loseCount.getOrDefault(m[1], 0) == 1) {
3 R8 ]9 ]# T4 b! v Y res2.add(m[1]);2 o7 s: ^' ?" i8 E( j8 D+ Q9 a
loseCount.put(m[1], 2); // avoid duplicates
K/ S2 ~ r2 a+ F$ h2 q }
' S3 Q9 v* I/ n }4 B+ c3 S4 E* s# J" p1 B. Q' [
Collections.sort(res1);1 s# `$ y) p$ `) `3 ?/ C
Collections.sort(res2);0 j. b$ s+ @3 \
return List.of(res1, res2);
. H4 g4 T9 | E. g. W }
. q" a7 R) s+ k" p}
) J7 b8 ~& T# O$ D! }' d4 Z2 h/ {5 n3 Q" D" `
. ?) X2 K0 Q8 P: `! o
【 NO.3 每个小孩最多能分到多少糖果】4 W$ u5 c: H5 n. E. t; w/ }
) n0 s- a1 g' p解题思路; V3 x/ p7 v) y% L
典型的二分答案题目。
' u g" d" ^3 @( T
* ?" |5 _3 _8 t代码展示. Q j& w) \/ L+ ]8 I
3 H6 o- z* n4 G/ ~+ z
+ A/ O! x' y9 V$ {/ xclass Solution {
% M2 C( }9 X5 `: ?9 M public int maximumCandies(int[] candies, long k) {7 E$ z8 G* t; U( E- L% ~, c6 `2 Z
int l = 0, r = Arrays.stream(candies).max().getAsInt();
' n# w$ D& I8 w+ | while (l + 1 < r) {* u# V- U6 M+ L/ X* D5 _. }4 }' b
int mid = (l + r) / 2;
2 n4 H, S8 c4 @. o4 f if (check(mid, candies, k)) {
+ [, w, ]3 @" L6 C; I9 w l = mid;" @, Z: }- F1 ~
} else {5 Z; k7 }: c" y! E
r = mid;3 u; a, V/ I+ w! X# Z$ ]
}
# F( v% b5 \: i& G }" s0 C6 H5 m. h! X& d
return check(r, candies, k) ? r : l;
, ^( r& {" ]; B }1 d% q& A1 h& F5 G
, r3 b4 I5 `$ I( e+ X8 f
private boolean check(int r, int[] candies, long k) {- b2 Y* R2 j$ X, F: E1 V4 d
for (int c : candies) {9 u+ M% h y( X% v8 m- U3 S* J
k -= c / r;' T$ i9 b, N3 X4 f/ j2 G
}% r6 i1 o& y+ T2 ^ l1 o
return k <= 0;# w, x' D8 M) w( y% }
}7 l' U U9 N- Q+ \7 y
}
, X) C1 ?) z( ^: C* g3 K$ B p0 `, K
( P) h$ Y3 ^+ C7 L9 G【 NO.4 加密解密字符串】! M. \$ v. ?6 A4 n3 x( _ A7 N X
4 M3 R- m; c/ o+ S& [3 r2 {- P$ T Q" _解题思路
" j8 U1 r4 r. r o7 b% x" e使用 Map 储存 keys 和 values 的映射,即可完成加密。
( w7 Z- H7 H$ @0 b* t7 m
/ p# y) m5 ]5 ~. q/ V; A解密需要借助 Trie 树判断当前解密的字符串分支 (因为一个密文可能对应多种明文) 是否属于 dictionary
1 F! D A+ e- K. L/ Y5 _
8 O+ k+ B( i" k) L0 E' d L/ S代码展示/ D C2 o h* `3 @) Z0 S, S1 D( P" B
, D8 L1 H9 d. c: I; D
class Encrypter {
+ X& p1 n- l( [2 {2 s k) |
) F/ A- r5 `2 L, h char[] keys;
4 Z0 k: O, q, T6 |6 {8 @ String[] values;
" s- P6 |( K' n# ^/ `! \ String[] dictionary;- N) w4 {6 B/ d- f
, t& m$ P9 K; P% `) G. ^% t/ X String[] keyToVal;+ {( E j9 Q# `
Map<String, List<Character>> valToKey;
0 O1 F6 s) I y2 R( @3 ] Trie dictTrie;
' \* f7 S5 G8 }% r# y/ t, H: z* d1 r; W: M
static class Trie {, s3 c- p L1 s# v' g1 p+ {
public Trie() {
* z& W! }( r- p* _* E1 \ root = new Trie.Node();
: T* T! K/ l) P. E) W }) W6 ?3 ~! {9 r+ E. x. l
5 F n1 D# |6 I
public void add(String word) {; E% g2 b2 Q5 G/ w; T9 n$ Y
Trie.Node node = root;
; o/ K3 M( i |. w) [ for (var i : word.toCharArray()) {' j* J1 T) l* ~
if (!node.children.containsKey(i)) {
, X; N1 R1 H# `/ W4 N" E node.children.put(i, new Trie.Node());
3 H, ] Y: `" l$ W9 R }3 p, f) M" V% `- D% X; Q( D6 H
node = node.children.get(i);4 v$ R! D2 H! C* [% B
}" `; y! B2 P2 {2 e" u
node.isWord = true;1 |$ U" t* E, r6 o, C
}5 x/ K# ]& @# x; V5 U" T/ ?
u8 h% v* Q. e3 z public boolean containsWord(String word) {4 a6 |4 t% A* B" g8 ~; j
Trie.Node node = root;
: m' D7 G: T% ~4 s8 R for (var i : word.toCharArray()) {
% S( z: u) L4 O* A if (!node.children.containsKey(i)) {
& [5 E a }/ s- x9 D1 K+ w# e return false;' e9 x) {# f1 g; \2 ]
}5 t6 w; [, v' Z' N. ~
node = node.children.get(i);( C6 l2 z8 ]2 ? I' {
}6 m( L5 [ ]/ _4 P1 w0 m
return node.isWord;
: p9 O- [% N! [' k" C9 b } p+ ^5 s, ^' J2 C8 B
* }" l: _0 T* [0 y3 F& d+ { public final Trie.Node root;
; w4 b& Y% D) Q+ K' Z, ?5 H" M% d) j! L. }
static class Node {1 f& D9 |! }) T' M* @' q k
boolean isWord;& g5 k: J) L5 R$ j+ p6 ~
Map<Character, Trie.Node> children;
7 X9 v3 o. |- d) M8 s, x9 y: D3 S) p0 N( C' E/ e4 u9 A/ {
public Node() {
$ h J* g" H. f' ?9 E- ?% ~ this.isWord = false;. V c, k1 i' B4 ]3 ~
this.children = new HashMap<>();/ O0 } x- M K T6 Z# J
}
* y( i5 s8 E! _1 E5 E }8 s' X7 d7 e) v- x9 O
}
, j1 B. b% i4 q+ A6 C! _- W* {
public Encrypter(char[] keys, String[] values, String[] dictionary) {
* \: [! l1 E! \& X$ }) D this.keys = keys;
) D7 R0 o# J2 z8 _ this.values = values;5 _1 _/ T7 e4 c: R- E$ j: V/ ?! Q0 w
this.dictionary = dictionary;: ]. S. C" _! V8 s: j$ T
keyToVal = new String[26];8 v, D l8 q3 e2 X
valToKey = new HashMap<>();
- n8 y$ G+ G9 [# v8 ~ for (int i = 0; i < keys.length; i++) {3 A$ R& p V7 U; U7 J' P7 M- S
keyToVal[keys[i] - 'a'] = values[i];
7 b2 A- v+ X2 @ if (!valToKey.containsKey(values[i])) {
# B+ r- v& P w5 ~' ?; {4 N# f valToKey.put(values[i], new ArrayList<>());
' @3 A$ c8 e: | }
- d* D' Y; _+ I valToKey.get(values[i]).add(keys[i]);
" \' z9 J; ^( {: R/ \ }: }( y0 [# b, {( R
dictTrie = new Trie();( t) |1 l0 N9 @8 y0 U/ r
for (String s : dictionary) {6 k G3 [4 f7 ?( q
dictTrie.add(s);2 A$ b9 _* e# l
}/ A+ d# u0 h! |; u; Q
}
! X3 U8 h" x+ v0 _4 J
8 x6 S+ w2 P- |: H4 W public String encrypt(String word1) {
$ _9 z5 S e j9 c StringBuilder builder = new StringBuilder();
0 m# w8 p, r" O) B) }- h4 ^ for (int i = 0; i < word1.length(); i++) {4 D$ `. b$ T8 W; ]- {
builder.append(keyToVal[word1.charAt(i) - 'a']);
0 n+ N# c# t2 y0 e8 E }$ U- g1 Y& P3 l3 k' P, i
return builder.toString();: y1 P3 ^4 x3 x. l p1 |1 y
}
* \8 q( W; `/ ]
& M" B8 |9 `. m% D3 {* c public int decrypt(String word2) {
; f# I' K; J g" f2 [ return decrypt(word2, dictTrie.root);: \) H; S% O0 A0 g$ e5 R
}
0 D5 |4 S _6 Z5 B& G6 d% X9 ^# T. Y6 O$ \" @# l
final private List<Character> emptyList = new ArrayList<>();
+ @, c0 i# ^, F$ A$ u, f% B1 ?
' s2 w7 S) a- X2 I private int decrypt(String word2, Trie.Node node) {9 a5 Y* v$ M+ Q0 l; A" z
if (word2.length() == 0) {* [$ y& J) s- [1 [
return node.isWord ? 1 : 0;4 j! n2 G3 b- P, L: {$ E
}
& h& a; Z) q1 A+ U$ h' } if (!valToKey.containsKey(word2.substring(0, 2))) {
! G; ]) G" x/ q, w, Q return 0;1 ]7 m/ i0 A( P7 J3 \7 G7 {
}& X7 l# D) f J9 q( g0 n! Y
var cand = valToKey.get(word2.substring(0, 2));+ }% ~6 g L; @9 u: ]
int res = 0;) _/ I/ h$ @' s( o' p' A1 H
for (var c : cand) {
: w2 E/ ~! R' |* ~+ {/ n3 j2 R if (node.children.containsKey(c)) {
+ w4 w9 R0 g, _% b8 C1 k res += decrypt(word2.substring(2), node.children.get(c));; h* ~0 c6 ?* Z
}. p% V$ X# U3 Z$ E
}7 u# ]% a6 C6 h: l) w: s! g
return res;
4 k3 M* U# d0 o0 n) g& q y }
% g: @( `$ g: X& H} |