java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846
文章目录
1. 倒退+迭代(除基取余法) 2. 省略掉反转操作 3. 系统提供API的自实现
当使用经典算法除基取余法后,发现效率最快的是调用的系统提供的API,所以我研究了底层代码,会在方法二给出。法一依然是经典的除基取余法。
1. 倒退+迭代(除基取余法)
解题思路:时间复杂度O(
l
o
g
2
∣
n
u
m
∣
log_2|num|
l o g 2 ∣ n u m ∣ ),空间复杂度O(
l
o
g
2
∣
n
u
m
∣
log_2|num|
l o g 2 ∣ n u m ∣ )
如果是0,则不需要转换,直接返回0 创建一个negative的boolean型变量,如果num是负数,就设置为true 然后num取绝对值,我们只对正数操作 我们通过字符数组,来保存除基取余的结果 每次都将取余7的结果保存到数组中,然后num变为除以7的商。就是除基取余的原理。直到num被除完。 最后如果negative是true,就添加一个负号 因为除基取余法,需要从后往前读取结果,所以需要我们将数组反转后返回
class Solution {
public String convertToBase7 ( int num) {
if ( num == 0 ) return "0" ;
boolean negative = num < 0 ;
num = Math . abs ( num) ;
StringBuffer digits = new StringBuffer ( ) ;
while ( num > 0 ) {
digits. append ( num % 7 ) ;
num /= 7 ;
}
if ( negative) {
digits. append ( '-' ) ;
}
return digits. reverse ( ) . toString ( ) ;
}
}
2. 省略掉反转操作
解题思路:时间复杂度O(
l
o
g
2
∣
n
u
m
∣
log_2|num|
l o g 2 ∣ n u m ∣ ),空间复杂度O(
l
o
g
2
∣
n
u
m
∣
log_2|num|
l o g 2 ∣ n u m ∣ )
法一中,我们最后需要将整个结果进行反转操作,因为这是除基取余的特性 但是如果我们从一开始就反着添加结果,最后不就不需要反转了吗?
class Solution {
public String convertToBase7 ( int num) {
char [ ] toChar = new char [ 33 ] ;
boolean negative = ( num< 0 ) ;
int charPosition = 32 ;
if ( ! negative) num = - num;
while ( num <= - 7 ) {
toChar[ charPosition-- ] = ( char ) ( '0' + ( - ( num % 7 ) ) ) ;
num = num/ 7 ;
}
toChar[ charPosition] = ( char ) ( '0' + ( - num) ) ;
if ( negative) toChar[ -- charPosition] = '-' ;
String s = new String ( Arrays . copyOfRange ( toChar, charPosition, charPosition+ ( 33 - charPosition) ) ) ;
return s;
}
}
3. 系统提供API的自实现
解题思路:时间复杂度O(
l
o
g
2
∣
n
u
m
∣
log_2|num|
l o g 2 ∣ n u m ∣ ),空间复杂度O(
l
o
g
2
∣
n
u
m
∣
log_2|num|
l o g 2 ∣ n u m ∣ )
Java提供的API是通过字节数组实现,效率更高 我们也通过字节数组将其实现. 而其实现居然和我们法二中大差不差,而且也是省略了反转操作。居然和我优化后的思路是一样的。
代码:效率会比法二高很多,但是官方测试用例太小,已经无法体现出差距了,如果数据量够大,一定是这个方法的字节数组更快。
class Solution {
static final char [ ] digits = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'a' , 'b' ,
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
'u' , 'v' , 'w' , 'x' , 'y' , 'z'
} ;
public String convertToBase7 ( int num) {
byte [ ] buf = new byte [ 33 ] ;
boolean negative = ( num< 0 ) ;
int charPosition = 32 ;
if ( ! negative) num = - num;
while ( num <= - 7 ) {
buf[ charPosition-- ] = ( byte ) digits[ - ( num % 7 ) ] ;
num = num/ 7 ;
}
buf[ charPosition] = ( byte ) digits[ - num] ;
if ( negative) buf[ -- charPosition] = '-' ;
String s = new String ( Arrays . copyOfRange ( buf, charPosition, charPosition+ ( 33 - charPosition) ) ) ;
return s;
}
}