
题目首先对等待程序猿成长之路系列的小伙伴们说声抱歉,春节来临,可能要拖更一段时间,但是草稿已经在写,发布将会于春节后进行发布
春节第一天闲着无聊打算找个蓝桥杯的题目练练手,诶嘿,这就找到一题,话不多说,上题
题目很好理解,就是要输入n个数,将其从十六进制转成八进制。一般的做法也如这里提示所说。要先转成10进制后转成八进制,但我认为先转成10进制会浪费计算机的算力并且提高了算法的时间复杂度,这种转换是完全可以进行优化的。
我的算法是直接将16进制转乘8进制,算法有如下几点要求:
下面来介绍一下我的算法:
package hexToOct;
public class HexToOct {
private static String hexToOct(String hex) {
char[] ch = hex.toCharArray(); //step1
StringBuilder builder = new StringBuilder();
int i = 0, incr = 0; // incr - 累进数, rest - 余数
//step2
for (int j = ch.length-1; j>= 0; j--) {
int numb = 0;
// 将十六进制转10进制
if (ch[j] >= '0' && ch[j] <= '9') {
numb = Integer.valueOf(ch[j] - '0');
} else if(ch[j] >= 'A' && ch[j] <= 'F') {
numb = Integer.valueOf(ch[j] - 'A') + 10;
} else {
System.out.println("请输入十六进制数");
return null;
}
// 处理每一位上的数字
numb = numb << (i++); // numb = numb * (2^i); i = i + 1;
numb += incr;
incr = numb / 8; // 求累进数,便于加入下一次的运算
numb = numb % 8; // 求当前的余数
builder.append(numb + "");
}
//考虑首位进位的情况
int rest = 0;
if (incr != 0) {
while(incr > 0) {
rest = incr % 8;
incr = incr / 8;
builder.append(rest + "");
}
}
return builder.reverse().toString();
}
public static void main(String[] args) {
System.out.println(hexToOct("8A24B"));
}
}
运算结果
2121113
算法复杂度O(n)