Google面试题,excel十进制字符串转换(java)

这篇博客探讨了如何解决Google面试中的一道题目,涉及将十进制数转换为Excel列名的字符串表示。重点在于处理边界值,尤其是数字能被26整除的情况。博主分享了处理不能被26整除情况的方法,即使用除k取余法将十进制数转化为26进制,并转换为对应的字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和171题一样,只不过转换顺序颠倒,增加了难度。

题目:输入十进制,输出对应的excel字符串列

1-A ,2-B ,3-C.....26-Z ,27-AA ,28-AB

关键点:需要考虑边界值问题,当number可以除尽26和不能除尽26.

我只做出了不能除尽26的,方法是除k取余法,即十进制转换为26进制,在把26进制每一位变成对应的字符,组成字符串

package mycode;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class Google2 {

//写完程序自己单元测试一遍,可以提高程序正确率
	
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Google2 test = new Google2();
		/*命令行参数
		if(args.length<0){
			System.out.println("error");
			System.exit(1);
		}else{
			int x1 = Integer.parseInt(args[0]);
			test.method(x1);
		}
		*/
		Scanner sca = new Scanner(System.in);
		System.out.println("Please input a number!");
		if(sca.hasNext()){
			int temp = sca.nextInt();
			test.method(temp);
		}else{
			System.out.println("The wrong number");
			System.exit(1);
		}
		sca.close();
	}
	public void method (int x){
		ArrayList<Integer> a = new ArrayList<>();
		ArrayList<Character> b = new ArrayList<>();
		
		int r = x;
		int m;
		if(x % 26 !=0){
			//下面这个循环是除k取余法,记住(以26为例)
			for(;;){//还可以改改,看用r!=0这个条件可不可以,一直add的是m余数
				m = r % 26;
				r = r / 26;
				if(r>26){//这一部分是一直除以26,并将余数存入list a里面
					a.add(m);
				}
				if(r<26 && r!=0){//这一部分是当除到最后余数的时候,r不是商了,也要把r放进list a
					a.add(m);
					a.add(r);
					break;
				}if(r==0){//一开始除以26就没有商的,即小于26的数,把第一次取模的值放入即可
					a.add(m);
					break;
				}
			}
			//用来验证method方法写的正不正确,除k取余法正确
			for(Iterator<Integer> ite = a.iterator(); ite.hasNext();){
				int array = ite.next();
				System.out.print(array +" ");//一定要记住,print打印字符串的时候,变量+字符串空格用双引号,不用单引号
				
			}
			
			for(int i=0;i<a.size();i++){
				int num = a.get(i)-1;
				char chr = (char)('A'+num);//用来将求得的26进制转换为字符串,每一位对应一个字符
				b.add(chr); 
			}
			System.out.println("\n" + "result is:");//换行符要加双引号
			for(int j=b.size()-1; j>=0; j--){
				System.out.print(b.get(j));//为什么会indexoutofbound,因为你j从最大开始算,但是list的索引还是size-1
			}
			
		}
                /*考虑边界值问题,能除尽26的话,这个没写出来,不会
                 else{
			for(;r>=26;){
				m = r % 26;
				r = r / 26;
				a.add(m);
			}
			a.add(r);//最后一个数添加进去
			for(Iterator<Integer> ite = a.iterator(); ite.hasNext();){
				int array = ite.next();
				System.out.print(array +" ");//一定要记住,print打印字符串的时候,变量+字符串空格用双引号,不用单引号
				
			}
			b.add('z');
			for(int i=1;i<a.size();i++){
				if(a.get(i)==1){
					b.add('z');
					continue;
				}else if(a.get(i)>1){
					int num3 = a.get(i)-2;
					char chr2 = (char) ('A' + num3);
					
					
				}
				
			}
		}
                */
         }

}

哎,看到这题,就心疼啊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值