最近換工作有點忙,刷題也不積極了~
5. 最長迴文子串
給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。
示例 1:
輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。
示例 2:
輸入: “cbbd”
輸出: “bb”
思路
根據要求有兩個點:
- 長度最長
- 迴文串
所以不妨假設存在這一的一個子串,逆序枚舉長度,一旦其是迴文,立馬返回即可。
分析一下時間複雜度,極限情況爲: 500500250 = 62500000 < 10^8,所以可嘗試一下。
解法
class Solution {
public String longestPalindrome(String s) {
String sub;
// 枚舉長度
for (int i = s.length(); i > 0; i--) {
// 順序取子串
for (int j = 0; j + i <= s.length(); j++) {
// 判斷合法與否
if(isPanlindrome( sub = s.substring(j, j+i))){
return sub;
}
}
}
return "";
}
private boolean isPanlindrome(String s){
int i=0, j= s.length()-1;
while(i<j){
if(s.charAt(i++)!=s.charAt(j--)){
return false;
}
}
return true;
}
}
6. Z 字形變換
將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。
比如輸入字符串爲 “LEETCODEISHIRING” 行數爲 3 時,排列如下:
L C I R
E T O E S I I G
E D H N
之後,你的輸出需要從左往右逐行讀取,產生出一個新的字符串,比如:“LCIRETOESIIGEDHN”。
請你實現這個將字符串進行指定行數變換的函數:
string convert(string s, int numRows);
示例 1:
輸入: s = “LEETCODEISHIRING”, numRows = 3
輸出: “LCIRETOESIIGEDHN”
示例 2:
輸入: s = “LEETCODEISHIRING”, numRows = 4
輸出: “LDREOEIIECIHNTSG”
解釋:
L D R
E O E I I
E C I H N
T S G
思路
通過畫圖標記處下標,很快就可以找到規律,無需詳說。
解法
class Solution {
public String convert(String s, int numRows) {
if (null == s || s.length() == 0) {
return "";
}
int n = 2 * numRows - 2;
if (n <= 0) {
return s;
}
return build(s, n, numRows);
}
private String build(String s, int n, int r) {
int i = 0, split;
boolean odd;
StringBuilder builder = new StringBuilder();
while (i < r) {
split = isFirstOrLast(i,r) ? n : n - (r - i - 1) * 2;
odd = true;
for (int j = i; j < s.length(); j += odd||isFirstOrLast(i,r) ? split : n - split) {
builder.append(s.charAt(j));
odd = !odd;
}
++i;
}
return builder.toString();
}
private boolean isFirstOrLast(int i, int r){
return (i == 0 || i == r - 1);
}
}
7. 整數反轉
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
思路
簡單的字符流。注意極限情況整形溢出就好。
解法
class Solution {
public int reverse(int x) {
long n = Math.abs((long) Math.abs(x));
boolean isPos = x >= 0;
String buf = Long.toString(n);
StringBuilder builder = new StringBuilder();
for (int i = buf.length() - 1; i >= 0; --i) {
builder.append(buf.charAt(i));
}
Long rn = new Long(builder.toString());
if (rn > Integer.MAX_VALUE || rn < Integer.MIN_VALUE) {
return 0;
}
if (isPos) {
return rn.intValue();
}
return -rn.intValue();
}
}
以上。