算法生疏了?来一道笔试题:用字母a-z表示26进制,26进制的加法

没找到原题的话术,这里就凭借印象来描述一下:

题目

用字母a-z表示26进制,编程26进制的加法(a代表0,b代表1,以此类推)
输入:(2行)

abcdefg
mvp

输出:(1行)

bcdrav

分析:

无非就是把2进制的算法移植到26进制中,再运用一个字母与数字的换算即可。

步骤:

  1. 计算26进制的字符串所代表的十进制数
  2. 两个十进制数相加求和
  3. 将十进制数的和再转化为26进制数

代码逻辑(java实现)

为了方便阅读,关键步骤都写在注释上了。

import java.util.Scanner;
import java.util.Stack;

public class q {
    public static void main(String[] args) {
        //获取26进制字符串
        Scanner input = new Scanner(System.in);
        String str1 = input.nextLine();
        String str2 = input.nextLine();

        //反转字符串,方便后面从个位取值
        str1 = new StringBuilder(str1).reverse().toString();
        str2 = new StringBuilder(str2).reverse().toString();

        //拆分26进制字符串的每个字符,为char数组
        char[] c1 = str1.toCharArray();
        char[] c2 = str2.toCharArray();

        //定义两个十进制数的累加器
        long addNum1 = 0;
        long addNum2 = 0;

        //得出十进制数
        for (int i = 0; i < c1.length; i++) {
            //同2进制一样,(当前位数字*进制的i次方)的累加和
            addNum1 += ((int) c1[i] - 97) * Math.pow(26, i);
        }
        //得出另一个十进制数
        for (int i = 0; i < c2.length; i++) {
            addNum2 += ((int) c2[i] - 97) * Math.pow(26, i);
        }

        //得出十进制总数
        long sum = addNum1 + addNum2;

        //考虑a+a=a的特殊情况
        if (sum == 0) {
            System.out.println('a');
            return;
        }

        //用栈来保存每个26进制上每一位所代表的十进制数字
        Stack<Long> stack = new Stack<Long>();
        while (sum != 0) {
            stack.push(sum % 26);
            sum /= 26;
        }

        String str = "";
        while (!stack.isEmpty()) {
            //将int转char,并合并到字符串上
            str += (char) (stack.pop() + 'a' - 0);
        }

        System.out.println(str);
    }
}

小结

我觉得,其实这道题是很容易想到思路的,但是综合了很多常用的解题知识点:

  1. 字符串的反转
  2. 字符串的拆分
  3. 字母相关的ASCII
  4. char转int
  5. int转char
  6. 二进制转十进制思路
  7. 十进制转二进制思路
  8. 栈、出栈、入栈、栈的遍历
  9. 模运算
  10. Math.pow()次方运算

对于java生疏的同学来说,这道题可以作为不错的复习巩固试题。

猜你喜欢

转载自blog.csdn.net/HuoYiHengYuan/article/details/104807586