10进制转n进制
辗转相除
class Solution {
//设置字符数组
//可以添加任意不重复字符,提高能转换的进制的上限
static char chs[] = new char[36];
static {
for(int i = 0; i < 10 ; i++) {
chs[i] = (char)('0' + i);
}
for(int i = 10; i < chs.length; i++) {
chs[i] = (char)('A' + (i - 10));
}
}
public int sumBase(int n, int k) {
StringBuffer buffer = new StringBuffer();
while(n > 0){
buffer.append(chs[n % k])
n = n / k;
}
return buffer.reverse().toString();
}
}
2.Excel列名(特殊进制处理)
思路:
我们所熟悉的进制转换一般都是从0开始,二进制0-1,十进制0-9;
但是Excel列名表示没有0的概念,从A开始,称之为“26进制” A-Z;
这时就不能直接用传统思路的辗转相除,第26列对应Z,直接辗转相除会得到AB
测试用例:26,27,28,701
错误的辗转相除!!!!!!!!!!!!!!!!!!!!
class Solution {
public String convertToTitle(int columnNumber) {
StringBuffer buffer = new StringBuffer();
while(columnNumber > 0){
buffer.append((char)('A' + columnNumber % 26));
columnNumber /= 26;
}
return buffer.reverse().toString();
}
}
问题就是出在此处的进制转换没有‘0’的概念,我们应该从1 开始。因此每次在执行进制转换的操作前,我们需要先对columnNumber执行减一操作,从而实现整体偏移。
class Solution {
public String convertToTitle(int columnNumber) {
StringBuffer buffer = new StringBuffer();
while(columnNumber > 0){
columnNumber--;
buffer.append((char)('A' + columnNumber % 26));
columnNumber /= 26;
}
return buffer.reverse().toString();
}
}
时间复杂度:O(log26(n))
空间复杂度:O(1)(不算构造答案所消耗的空间)