概述
算法练习记录
- 题目一
- 分析
- 算法实现
- 提交测试
- 题目二 回文数
- 分析
- 算法实现
- 方法一 字符串反转
- 方法二 数学计算
题目一
给你一个由小写字母组成的字符串 s ,以及一个整数 k 。
首先,用字母在字母表中的位置替换该字母,将 s 转化 为一个整数(
也就是,'a' 用 1 替换,'b' 用 2 替换,... 'z' 用 26 替换)。
接着,将整数 转换 为其 各位数字之和 。共重复 转换 操作 k 次 。
例如
如果 s = "zbax" 且 k = 2 ,那么执行下述步骤后得到的结果是整数 8 :
转化:"zbax" ➝ "(26)(2)(1)(24)" ➝ "262124" ➝ 262124
转换 #1:262124 ➝ 2 + 6 + 2 + 1 + 2 + 4 ➝ 17
转换 #2:17 ➝ 1 + 7 ➝ 8
返回执行上述操作后得到的结果整数。
示例:
输入:s = "iiii", k = 1
输出:36
解释:操作如下:
- 转化:"iiii" ➝ "(9)(9)(9)(9)" ➝ "9999" ➝ 9999
- 转换 #1:9999 ➝ 9 + 9 + 9 + 9 ➝ 36
因此,结果整数为 36 。
分析
这道题的步骤非常的清晰,大致如下:
(1) 先将字符串的每个字符都转为数字
(2) 然后根据 k (转换次数),递归求出各位数字的和
算法实现
public int getLucky(String s, int k) {
String str = stringToIntstr(s);
return sum(str,k);
}
public int sum(String intString,int k){
int s = Integer.valueOf(intString);
int sum = 0;
while(s > 0) {
sum += s % 10;
s /= 10;
}
k--;
if (k > 0){
sum = sum(String.valueOf(sum),k);
}
return sum;
}
public String stringToIntstr(String string){
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < string.length(); i++) {
stringBuilder.append(string.charAt(i) - 'a' + 1);
}
return stringBuilder.toString();
}
经过简单的测试,似乎没有问题。
但是却忽略l了一个很严重的问题,在进行各位数字求和时我先将字符串转为整数,然后求各位之和,但是没注意int的取值范围,如果输入的字符串长度大于稍微长一点就会超出int的范围。
继续改进一下,在第一次转换的时候进行求和,除非字符串的长度有上亿位否则,各位之和不可能超过int 的范围。
public int getLucky(String s, int k) {
// 先进行一次转换求和
String str = stringToIntstr(s);
int res = 0;
for (int i = 0; i < str.length(); i++) {
res += str.charAt(i) - '0';
}
// 然后将第一次的结果传进去求和就可以避免超出int的范围
if(k > 1) return sum(res,k-1);
return res;
}
// 对整数各位数字求和
public int sum(int c,int k){
int sum = 0;
while (c > 0){
sum += c % 10;
c /= 10;
}
k--;
if (k > 0){
sum = sum(sum,k);
}
return sum;
}
// 将字母转为数字
public String stringToIntstr(String string){
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < string.length(); i++) {
stringBuilder.append(string.charAt(i) - 'a' + 1);
}
return stringBuilder.toString();
}
提交测试
题目二 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
分析
这道题比价简单,想到的第一个方法是将数字转为字符串,然后反转字符串,比较它们是否相等。
第二种方法是,通过计算算出每个位置上的数字然后反转,具体如下:
对于整数 n 而言 个位上的数字位 a = n % 10;
十位上的数字:b = (n / 10) %10
百位上的数字:c = (n / 100) %10
那么它反转后的数字就应该是 a * 100 + b * 10 + c,最后比较二者是否相等即可.
算法实现
方法一 字符串反转
public boolean isPalindrome(int x) {
String s = String.valueOf(x);
StringBuilder reverse = new StringBuilder(s).reverse();
return s.equals(reverse.toString());
}
方法二 数学计算
负数和结尾是0(不包含0) 的整数一定不是回文数,直接返回false。
public boolean isPalindrome(int x) {
if (x < 0 || (x%10 == 0 && x !=0)){
return false;
}
int revNum = 0;
int p = x;
while (p > 0){
revNum = revNum * 10 + p % 10;
p /= 10;
}
return revNum == x;
}
最后
以上就是花痴小鸭子为你收集整理的算法练习记录(三) ----- 字符串转数字求各位之和与回文数题目一题目二 回文数的全部内容,希望文章能够帮你解决算法练习记录(三) ----- 字符串转数字求各位之和与回文数题目一题目二 回文数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复