我是靠谱客的博主 花痴小鸭子,最近开发中收集的这篇文章主要介绍算法练习记录(三) ----- 字符串转数字求各位之和与回文数题目一题目二 回文数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

算法练习记录

  • 题目一
    • 分析
    • 算法实现
    • 提交测试
  • 题目二 回文数
    • 分析
    • 算法实现
      • 方法一 字符串反转
      • 方法二 数学计算

题目一

给你一个由小写字母组成的字符串 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;
    }

在这里插入图片描述

最后

以上就是花痴小鸭子为你收集整理的算法练习记录(三) ----- 字符串转数字求各位之和与回文数题目一题目二 回文数的全部内容,希望文章能够帮你解决算法练习记录(三) ----- 字符串转数字求各位之和与回文数题目一题目二 回文数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部