- 字符串相加
fun addStrings(num1: String, num2: String): String {
val l1 = num1.length
val l2 = num2.length
var i = l1 - 1
var j = l2 - 1
var signal = 0
var result = ""
while (i >= 0 || j >= 0 || signal == 1) {
val n1 = if (i >= 0) num1[i] - '0' else 0
val n2 = if (j >= 0) num2[j] - '0' else 0
val sum = n1 + n2 + signal
signal = if (sum >= 10) 1 else 0
result = (sum % 10).toString() + result
i--
j--
}
return result
}
- 字符串相乘
fun multiply(num1: String, num2: String): String {
if (num1 == "0" || num2 == "0") {
return "0"
}
val list = IntArray(num1.length + num2.length)
list.forEachIndexed { index, _ -> list[index] = 0 }
for (i in num1.indices.reversed()) {
for (j in num2.indices.reversed()) {
var index = num1.length + num2.length - i - j - 2
var temp = (num1[i] - '0') * (num2[j] - '0') + list[index]
list[index++] = temp % 10
while (temp >= 10 && index < list.size) {
temp = temp / 10 + list[index]
list[index++] = temp % 10
}
}
}
val start = if (0 == list[list.size-1]) 1 else 0
return list.reversed().subList(start, list.size).joinToString(separator = "")
}
- 最长子串
fun lengthOfLongestSubstring(s: String): Int {
val map = HashMap<Int, Char>()
var max = 0
var left = 0
for (i in s.indices) {
if (map.containsValue(s[i])) {
while (map[left] != s[i]) {
map.remove(left++)
}
map.remove(left++)
}
map[i] = s[i]
if (i - left + 1 > max) {
max = i - left + 1
}
}
return max
}
-
最长子串 优化版
-
思路类似 容器进行优化:只需使用整型数组 (index,data) index存放char的值 data存放char的序号
-
遍历字符串时遇到第二次同一个index时, 更新index对应的data值 并且更新最长子串长度数值
fun lengthOfLongestSubstring(s: String): Int {
val pos = IntArray(256)
pos.fill(-1, 0, pos.size)
var st = 0
var res = 0
for (i in s.indices) {
val index = s[i].toInt()
if (pos[index] < st) {
res = max(res, i - st + 1)
} else {
st = pos[index] + 1
}
pos[index] = i
}
return res
}
- Z字型变换
public String convert(String s, int numRows) {
if (s.length() <= 2 || numRows == 1 || s.length() <= numRows) {
return s;
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < numRows; i++) {
if (s.isEmpty()) break;
boolean willAdd = true;
int temp = i;
builder.append(s.charAt(temp));
if (2 * (numRows -1-i) == 0)
willAdd = false;
temp += 2 * (numRows -1-i);
while (temp < s.length()) {
if (willAdd) builder.append(s.charAt(temp));
if (i == 0) willAdd = false; else willAdd = true;
temp += 2 * i;
if (temp >= s.length()) break;
if (willAdd) builder.append(s.charAt(temp));
if (2 * (numRows -1-i) == 0) willAdd = false; else willAdd = true;
temp += 2 * (numRows -1-i);
}
}
return builder.toString();
}
- 有效的括号
private static Character[] c1 = {'(', '[', '{'};
private static Character[] c2 = {')', ']', '}'};
public boolean isValid(String s) {
if (s.length() == 0) return true;
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); ++i) {
char c = s.charAt(i);
if (contain(c1, c)) stack.push(c);
else if (contain(c2, c)) {
if (stack.isEmpty()) return false;
if (match(stack.peek(), c)) stack.pop();
else return false;
}
}
if (stack.isEmpty()) return true;
return false;
}
private boolean contain(Character[] cs, char c) {
for (int i = 0; i < cs.length; ++i) {
if (c == cs[i]) return true;
}
return false;
}
private boolean match(char a, char b) {
if ((a == '(' && b == ')') || (a == '[' && b == ']') || (a == '{' && b == '}')) return true;
else return false;
}
- 括号生成
private List<String> result = new ArrayList<>();
public List<String> generateParenthesis(int n) {
fun(n, n, 0, n, "");
return result;
}
private void fun(int lNum, int rNum, int lNow, int n, String temp) {
if (lNow > 0) {
if (lNum > 0) {
fun(lNum - 1, rNum, lNow + 1, n, temp + '(');
String t = temp.substring(0, n * 2 - lNum - rNum) + ')';
fun(lNum, rNum - 1, lNow - 1, n, t);
} else
fun(lNum, rNum - 1, lNow - 1, n, temp + ')');
} else {
if (lNum == 0)
result.add(temp);
else
fun(lNum - 1, rNum, lNow + 1, n, temp + '(');
}
}
More info: CSDN