目录
LC-20 有效的括号 E
输入: "()[]{}"
输出: true
输入: "(]"
输出: false
class Solution {
public:
bool isValid(string s) {
unordered_map<char,int> m{{'(',1},{'[',2},{'{',3},
{')',4},{']',5},{'}',6}};
stack<char> st;
for(char c:s){
int flag=m[c];
if(flag>=1&&flag<=3) st.push(c);
else if(!st.empty()&&m[st.top()]==flag-3) st.pop();
else {return false;}
}
return st.empty();
}
};
LC-8 字符串转换整数 (atoi) M
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
因此无法执行有效的转换。
class Solution {
public:
int myAtoi(string str) {
long result(0);
int str_size=str.size();
int flag=1;//存储+-标志位
bool start=false;//数字读取是否已经开始
//若之后再出现不是数字的字符,则break
for(int i=0;i<str_size;i++){
if(str[i]==' '&&start==false){
continue;
}
if(str[i]=='-'&&start==false){
flag=-1;
start=true;
continue;
}
if(str[i]=='+'&&start==false){
flag=1;
start=true;
continue;
}
if(str[i]>='0'&&str[i]<='9'){
start=true;
result=result*10+str[i]-48;
//判断溢出
if(flag*result>INT_MAX)
return INT_MAX;
if(flag*result<INT_MIN)
return INT_MIN;
continue;
}
else{
break;
}
}
return flag*result;
}
};
class Solution {
public int myAtoi(String str) {
int rev = 0;
char[] charList = str.toCharArray();
int length = str.length();
int zf = 1;
int i = 0;
int pop = 0;
for(; i < length; i++){
if(charList[i] == ' '){
continue;
}else{
if(charList[i] == '-'){
i++;
zf = -1;
break;
}
if(charList[i] == '+'){
i++;
break;
}
if(charList[i] <'0' || charList[i] >'9'){
return 0;
}else{
break;
}
}
}
if(i == length){
return 0;
}
for(;i < length; i++){
if(charList[i] <'0' || charList[i] >'9'){
return rev;
}
pop = (charList[i] -48) * zf;
if(rev*10>Integer.MAX_VALUE || (rev == Integer.MAX_VALUE / 10 && pop > 7)){
return Integer.MAX_VALUE;
}
if(rev*10<Integer.MIN_VALUE || (rev == Integer.MIN_VALUE / 10 && pop < -8)){
return Integer.MIN_VALUE;
}
rev = rev * 10 + pop;
}
return rev;
}
}
6. Z 字形变换 M (模拟)
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
解释:
L C I R
E T O E S I I G
E D H N
输入: 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 (numRows == 1) return s;
vector<string> rows(min(numRows, int(s.size())));
int curRow = 0;
bool goingDown = false;
for (char c : s) {
rows[curRow] += c;
if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
curRow += goingDown ? 1 : -1;
}
string ret;
for (string row : rows) ret += row;
return ret;
}
};
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) return s;
List<StringBuilder> rows = new ArrayList<>();
for (int i = 0; i < Math.min(numRows, s.length()); i++)
rows.add(new StringBuilder());
int curRow = 0;
boolean goingDown = false;
for (char c : s.toCharArray()) {
rows.get(curRow).append(c);
if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
curRow += goingDown ? 1 : -1;
}
StringBuilder ret = new StringBuilder();
for (StringBuilder row : rows) ret.append(row);
return ret.toString();
}
}
17.电话号码的自由组合 M(全排列)
全排列没啥好说的,
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
class Solution {
Map<String, String> phone = new HashMap<String, String>() {{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}};
List<String> output = new ArrayList<String>();
public void backtrack(String combination, String next_digits) {
if (next_digits.length() == 0) {
output.add(combination);
}else {
String digit = next_digits.substring(0, 1);//0
String letters = phone.get(digit);
for (int i = 0; i < letters.length(); i++) {
String letter = phone.get(digit).substring(i, i + 1); //i
backtrack(combination + letter, next_digits.substring(1)); //[1-n-1]
}
}
}
public List<String> letterCombinations(String digits) {
if (digits.length() != 0)
backtrack("", digits);
return output;
}
}