首页 > 其他分享 >解码方法 二进制求和 找出字符串中第一个匹配项的下标 罗马数字转整数

解码方法 二进制求和 找出字符串中第一个匹配项的下标 罗马数字转整数

时间:2022-11-18 22:22:54浏览次数:48  
标签:case pre return int 解码 罗马数字 ans 下标 dp

91. 解码方法

int n = s.length();
s = " " + s;加上一个空格,防止前置零和越界
char[] ch = s.toCharArray();
int[] dp = new int[n + 1];
dp[0] = 1;
for(int i = 1; i <= n; i++) {
int a = ch[i] - '0';
int b = (ch[i - 1] - '0') * 10 + (ch[i] - '0');
if(a >= 1 && a <= 9) {
dp[i] += dp[i - 1];因为一个位置可能右多种情况
}
if(b >= 10 && b <= 26) {
dp[i] += dp[i - 2];所以是+=
}
}
return dp[n];


67. 二进制求和

int ca = 0;
StringBuilder ans = new StringBuilder();
for(int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
int sum = ca;
sum += i >= 0 ? a.charAt(i) - '0' : 0;
sum += j >= 0 ? b.charAt(j) - '0' : 0;
ans.append(sum % 2);
ca = sum / 2;进位
}
ans.append(ca == 1 ? 1 : "");
return ans.reverse().toString();reverse()倒置


28. 找出字符串中第一个匹配项的下标

int n = haystack.length(), m = needle.length();
for(int i = 0; i + m <= n; i++) {每个下标都来一遍,记得预留位置, 所以i + m <= n,而且你最少要预留一个寻找位,所以有等号
boolean flag = true;
for(int j = 0; j < m; j++) {
if(haystack.charAt(i + j) != needle.charAt(j)) {
flag = false;
break;
}
}
if(flag) {
return i;
}
}
return -1;


13. 罗马数字转整数

int ans = 0;
int pre = dnn(s.charAt(0));
for(int i = 1; i < s.length(); i++) {思路就是比较前面的和后一位
int cur = dnn(s.charAt(i));
if(pre < cur) {前面的更小则减去
ans -= pre;
}else {
ans += pre;否则加上
}
pre = cur;
}
ans += pre;加上最后一位
return ans;
}
public int dnn(char ch) {
switch(ch) {
case'I': return 1;
case'V': return 5;
case'X': return 10;
case'L': return 50;
case'C': return 100;
case'D': return 500;
case'M': return 1000;
default: return 0;
}
}

标签:case,pre,return,int,解码,罗马数字,ans,下标,dp
From: https://www.cnblogs.com/xtag/p/16905044.html

相关文章