登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组中的第一个回文字符串】' g- Q5 ^9 x% }! ?9 x3 C
$ d# H8 r0 n' ` N; Q- x7 i1 E解题思路7 P1 a5 {% Z! j. W, B4 f% J0 v
签到题,遍历一次即可。' c6 g4 D$ L& t6 b+ }" A
& k3 K9 [- X, q2 E代码展示
( @% F) l; [6 I- M% L2 l
4 j; C2 f) V4 a( J8 V9 Q! C1 e+ Uclass Solution {' f& D; _0 Z6 T0 o: N( Z
public String firstPalindrome(String[] words) {! a0 c3 M4 O8 M; p# P: F Y i
for (var w : words) {
+ \& p. k4 L$ D boolean found = true;
! z) t2 |0 I1 t4 E& C0 X for (int i = 0, j = w.length() - 1; i < j; i++, j--) {% Q" O5 U( b% h Z& g0 P: G# B
if (w.charAt(i) != w.charAt(j)) {
& o) I* f& J+ z( e. a/ {9 F found = false;& g% Y) V4 U3 [, A6 M9 B8 D p
break;/ M2 w, p3 Y6 o* J: n: ]/ n4 c$ n
}. \& s. \" e3 F4 E) S
}% x- ^1 ?6 f" L4 y
if (found) {
9 ?, L) y* q7 l# _ return w;3 m9 n9 w% c7 V+ s
}
5 c, ?1 R7 M- N6 K. f2 D4 L4 R }
t8 F# ?: b! y) W2 G# d8 ~ return "";
$ j6 }! a7 _. H9 W }7 N3 G, D- u z( S6 \# A
}2 I0 q: U8 m; M( {7 N
1 }% R2 _9 `* I
- g5 A) V$ O4 F8 v
【 NO.2 向字符串添加空格】" C5 R: W7 c3 {: ^
8 _) o1 x- e$ O3 Q8 y6 Q! a( M; k& g
解题思路
! A6 M2 Z( t8 f+ R; g& `& m: h使用一个 StringBuilder 维护新的字符串。" v5 p9 c: \8 X r, Z% F2 ?
7 N" O" O1 R+ }6 I$ j7 _
代码展示9 H" d/ D: h) X1 ]5 S0 J( x$ M
) }: y0 A; z1 _! o
class Solution {
n# S: h) c" r public String addSpaces(String s, int[] spaces) {7 I: m& c; ^: V( y3 x& X' W( R" F
StringBuilder sb = new StringBuilder();2 O( x2 y! b+ r' R# L/ n8 [
int sp = 0;
8 w6 Y! J6 f7 n; _1 a for (int i = 0; i < s.length(); i++) {
/ v* k8 T: Q+ N% T; d. R# F) S, u if (sp < spaces.length && i == spaces[sp]) {5 h0 A3 b! P9 n" }4 E! i
sp++;$ y/ J8 W- Q9 {9 g; W; K
sb.append(' ');4 s" @' X0 d; k
}! ~1 C6 }% w* {! x; V0 ^/ f
sb.append(s.charAt(i));1 ^1 p; I, N i
} Z5 S2 u" G/ o4 O- k& `
return sb.toString();
8 Y* q1 o0 v Z: m* Z8 x$ ^ }% Q0 d7 D8 N9 E, s9 t5 [& ]
}
; u. t' n! w5 E6 Q1 H4 ?9 x
) h5 Q/ H3 G: x5 E# m( F9 N8 v
* w, I! q. v: ]5 F+ V【 NO.3 向字符串添加空格】
/ g9 P( O0 L! |+ C: ]3 Z/ z' j& y6 G! x) \$ B! b9 @
解题思路! s. M9 D, Q$ }% Q. V) o0 V
双指针。5 \. L. `# u8 A3 |
! x9 y Q" _( [代码展示
y6 R E. ^) D" Z) V" y6 O. {4 U1 }" e9 {. c
class Solution {
4 D5 K5 Y! Q* i' ?1 F public long getDescentPeriods(int[] prices) {
- N# ^- K/ L0 Z! d$ W long result = 0;% }( x; ~8 w+ J, o
for (int i = 0, j = 0; i < prices.length; i++) {
/ F, @9 Z$ u$ v" L8 } if (i > 0 && prices[i] != prices[i - 1] - 1) {
$ E/ x2 z4 I# [: ~5 M j = i;
5 [7 i5 i& E. o! h }
2 ^6 ^8 a3 ?6 R& ?" o // [j, i] 是一个平滑下跌阶段. u G2 z. j, h7 f% M: x" n
result += i - j + 1;
8 y4 q" s7 z; a }$ s, Q' s: Z! c& K3 `( M- [; g
return result;. o( B4 G! N) k: u; h, |- p p" ` M
}
5 n f4 B* R" i% w: Q. N4 s}
5 U# \; x- b4 m, Y" ?3 k
0 w1 B! T2 B6 v# v/ O {8 x; v. }! F+ _# f1 [/ w0 y, j+ j$ Y8 V: G
【 NO.4 使数组 K 递增的最少操作次数】$ P2 k: x9 V' m7 m! v: f4 o% i
2 ?/ K8 f$ `$ x3 k+ i) F9 y解题思路
E* i" M s) W2 x1 @原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。 M5 D8 U( F; A6 B8 w( r3 n* b
, u; C1 ]. U$ k0 g& g1 u% x然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。( E _7 Q5 b7 \- F4 A( b0 ?' h; n
" z2 h2 I- _4 K2 b- h' D代码展示
" g l4 m; e( z$ n
0 b2 D- E2 v0 @( y. ?4 zclass Solution {
5 ~% I$ j3 t5 n* _ public int kIncreasing(int[] arr, int k) {; Y! l9 d7 X# g( s& m8 [
int result = 0;- A, z0 w( S$ Y5 V
for (int i = 0; i < k; i++) {
& _4 G$ R8 m0 \9 x' E List<Integer> list = new ArrayList<>();; Q( W: l8 q! j- [! |9 X0 F5 o
for (int j = i; j < arr.length; j += k) {
4 D4 m1 y5 ^4 Z$ t list.add(arr[j]);
1 M: G: [, f; O" s# H1 w }$ Z* c, D: o' f/ T& b
result += increasing(list);
7 ] U2 y( O( g( Q z7 m7 w! m }
( V8 ]" A# Y" l1 x0 P+ l! F1 c return result;; h: C% c4 K4 M- c9 }/ U
}! ^; e2 m: K$ e
9 x; A) [" ^: X private int increasing(List<Integer> nums) {0 M3 y( w9 ?8 J: M0 ?9 y
// 将 nums 变成递增
8 K+ \3 q$ r) d3 f% v // nlogn 求 LIS4 s9 @1 k8 M ~- {/ k2 x7 J
int[] dp = new int[nums.size()];4 I2 y* ]4 W. X4 Z" d& d
int len = 0;; A, @& O" [& C$ R* d0 B. g" v
for (int num : nums) {
! F2 d4 H) b( f, O; A int l = 0, r = len;/ O4 Q" i2 R- k
while (l < r) {2 V- b! I1 F [/ ]- |
int mid = (l + r) / 2;7 U: k. W. v& ?$ W) G- @/ y
if (dp[mid] <= num) { // 非严格递增,等于也可
) L/ |9 G: F. U7 H* f) p0 l l = mid + 1;
! R4 \5 Z. ?& e' F0 g } else {
. d6 h B5 V+ o$ k. Q8 G* y5 d3 { r = mid;
) }( y" m$ d# `7 ?+ P }1 h* p8 ~ p9 F4 K1 t
}
! N4 z# j, F6 c+ t9 ` if (r >= len) {1 o+ n& p' [6 t7 x) J5 L
len++;
5 X2 D5 A( v6 o8 |% Z' L }. |( p$ `9 v5 e4 z, ?! w
dp[r] = num;
" n% H- p; Z) q: ?3 T }$ C+ J5 n5 X0 ?& }( A1 K5 Q5 g
$ F$ a3 u0 J m+ j7 p+ i) D
return nums.size() - len;/ t- X, _' s+ p! [* ~
}
3 ?) i6 L& _; e% [, w} |