登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组中的第一个回文字符串】
& `/ b) k( L( \/ E# K. b0 Z
p8 ]+ g' n; R, Y I% [& ~% N解题思路
' @- n# T7 t# B# i2 p' i0 S& f签到题,遍历一次即可。/ P/ Q" }6 ~0 T% z7 `& I0 m6 |: d
. p, t& X. q+ M( l" T$ t
代码展示
1 g. ]" I* T5 ]; D1 w+ \! U5 z2 n7 \9 W; d; p* K# B
class Solution {) n% }" u/ F8 w) ~- `9 s- J' V* c
public String firstPalindrome(String[] words) {
( Y5 P6 I3 l" W2 l1 _1 R for (var w : words) {
; i" Z# [" p; I! w5 l6 u boolean found = true;
* v, \! V+ F" b3 r, [ for (int i = 0, j = w.length() - 1; i < j; i++, j--) {
5 b! a5 ~' [* I, {' w if (w.charAt(i) != w.charAt(j)) {# u8 b: t: R" N) w' n( l
found = false;' ]" T. I c$ s# j6 g8 u0 q
break;! v+ G3 v) m0 x# Q0 [' b) W7 Q
}
% N6 ]( W/ G) K7 ^' M" d }3 q- i6 ~$ c+ }: ^0 |8 k- n$ B- v7 }7 u
if (found) {
3 t! N( u4 ?! u+ M return w;
! m: C# V0 J: q0 ^ j }
( t1 v" o, Z5 d1 M$ d, T+ b( n6 Z; w }
& U4 s, y. k- T2 {, N4 G' A return "";: V+ G9 @) x& J( V) O. Q3 {
}/ c0 H. n* I4 C. w) b7 \+ K/ v
}
0 X+ }2 H" t% i9 j
# z, O+ V J f* ^1 \. A" z* Z2 M+ T( t6 _( r: A$ e3 ^
【 NO.2 向字符串添加空格】3 Q2 w* s# m# `# C8 ^
# t' ?) ?. |2 W. f解题思路
3 N6 q h4 J9 k- _使用一个 StringBuilder 维护新的字符串。% R# [! ~3 J0 O; }1 P
0 k0 b9 a; f- D9 D6 t; E* R代码展示
1 p% x7 f! f, q- p* ` G0 E( d: V/ ^. O) q' T2 {4 x0 k- x$ C
class Solution {
( A" I) g5 u z6 ~9 ~( D% k public String addSpaces(String s, int[] spaces) {
, s% j) B& z/ v. K StringBuilder sb = new StringBuilder();( ]+ _7 H! e* E! K) ^+ O5 ?
int sp = 0;
! F2 G. f. v: P for (int i = 0; i < s.length(); i++) {3 v; D$ d3 X0 g. U! N( j/ e% a
if (sp < spaces.length && i == spaces[sp]) {0 u3 ?( z1 l& A! J
sp++;
, W& v8 w7 u% ] sb.append(' ');2 v8 G$ k- v9 b3 A
}
( K1 H4 ~* U. C sb.append(s.charAt(i));# Y% K$ G+ v' S& C. [
}
' @1 T, {0 X' J! g+ _" g return sb.toString();
* A! u2 |# J' n# P# l }
/ s* P8 G4 _1 I}
+ [% |2 u) i9 d) z7 ?9 }, N8 J2 v; _. J! p s8 x3 m+ v. m8 M; e
s2 D& Z2 @- ~$ L: ?" Q) b【 NO.3 向字符串添加空格】
# D! q7 g1 c5 y3 H# m# F A2 P/ V( B5 E* q3 Z% S7 v
解题思路
" ]$ S( o3 a* n# B双指针。# S. O& [; a! a; D2 }
! a1 ^: A8 R. {0 t: X0 B代码展示
2 j) {# z! F+ Q
* ]3 ]$ Z3 D% {9 T$ _class Solution {
* a+ k1 o5 i: N/ v5 ?/ N0 E public long getDescentPeriods(int[] prices) {
7 j) B- m: S2 |6 ~3 s# ]7 j long result = 0;
; K% G' Y7 ~4 Q for (int i = 0, j = 0; i < prices.length; i++) {
8 t! Z" c+ d t if (i > 0 && prices[i] != prices[i - 1] - 1) {2 a3 ]2 G x4 G/ d: U) E/ \ X4 B
j = i;3 h3 i8 U/ y! f i7 @
}
& `. @& p0 \# g0 E5 I // [j, i] 是一个平滑下跌阶段8 b: A8 @0 j4 U" g/ z+ o5 \9 @6 O6 C
result += i - j + 1;
' O. W; X$ W9 G! a3 y5 d }
, x: F% D, T, X' k8 I% M return result;$ `. q' @9 j! H: c4 {( i4 K/ |9 c; l
}
; o& X3 V7 M* ^6 n! g}
7 |7 B5 U6 s% i( a3 E C
, w6 u+ G+ Q% K
8 J% x; w+ @1 Y m9 L: U【 NO.4 使数组 K 递增的最少操作次数】
% v4 ^- A5 w5 R4 q( s# a9 \8 @1 K T- h& v h
解题思路
% g: t* H2 p- P+ l0 z$ V* o9 g* }原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。
2 J+ e4 T5 p1 f" D1 f5 M& f/ s" ^4 r& v' K9 `8 U3 V7 v
然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。8 Q. i1 s7 v& G
- y5 z5 M) Z, O/ J" w4 l
代码展示9 V) _ h6 X. u% Y$ n) c
5 Q) H. D/ V4 t4 i8 o* Rclass Solution {0 q( e/ i5 f/ p
public int kIncreasing(int[] arr, int k) {
: O5 g" v2 I3 o" _2 N int result = 0;# `- ?4 q- B6 G8 l- x/ x
for (int i = 0; i < k; i++) { @1 K$ R5 y5 K" ?3 d# b
List<Integer> list = new ArrayList<>();
! h( @ q- J9 ^" Y/ L& s7 q* Q0 O9 z for (int j = i; j < arr.length; j += k) {* Y* _: y" L W% \+ ~$ i5 {
list.add(arr[j]);3 Z% V4 g3 P1 R0 z0 _
}
* e6 b d- W9 |. L e" \2 A4 T result += increasing(list);0 N4 g% k% o: E
}
8 x0 v5 P7 D( l: n return result;
8 y& f9 c4 z7 ]) j& D. `# X }
* A2 P1 d+ z) o, ~, f0 `. ^7 ?9 I! Q! _2 L8 w5 C, w
private int increasing(List<Integer> nums) {2 W) k6 |' e% L( e9 x/ [4 |
// 将 nums 变成递增
, Z7 b& Y8 S3 J: i4 C // nlogn 求 LIS
. F4 b4 x5 R) y9 \6 w8 E9 j int[] dp = new int[nums.size()];
7 |% @$ T6 Y7 c1 t* D int len = 0;* _, ?& S3 O9 o% P/ p! H# j! t
for (int num : nums) {
- d% Y v- @( \' T! G6 p$ u. Z' {8 H int l = 0, r = len;
, x5 l5 j3 z' |4 n9 P) r% O3 z while (l < r) {' U) h. ~/ U) m7 J
int mid = (l + r) / 2;, E( g3 q. b, R! z
if (dp[mid] <= num) { // 非严格递增,等于也可% E4 i/ j: u( @* \5 |7 N6 y
l = mid + 1;, K7 i4 U7 T! X) U
} else {: r! U4 }# Z7 M1 H+ S- u
r = mid;
3 B" _2 t! |$ T* _$ s }
5 j/ z3 _3 k9 B }3 ~, M; z! _" l2 ~4 f: U; D
if (r >= len) {
& m6 Z0 [' n) X' c: l8 _ len++;
! B3 u9 p) H( G1 D; t }; a7 ^6 q( ^5 I0 u1 H
dp[r] = num;: l8 N! j* G, q. m4 C) D: B
}/ d& [. [+ d: a. y+ z) Z+ u, Q
2 f6 |: ?0 p* R- @7 @
return nums.size() - len;
: x) G: h1 [* P, y" H' [$ `0 M# [ }# s9 \1 U' @% s3 ^( r
} |