首页 > 编程知识 正文

刷一遍剑指offer多久,剑指offer适合什么人看

时间:2023-05-03 22:23:54 阅读:160598 作者:3061

第一章整数:第一题开门见山直接上题

1 .输入两个int型整数,将它们除以并返回商。 要求不使用乘除号、除号/和馀数码%*,如果存在溢出,则返回最大整数值。 假设除数不为0。 例如,输入15和2,然后输出15/2或7。

(注意: int型范围为-2 ^31~-2 ^31-1 ) ) ) ) )。

分析:

如果不用乘法和除法的话,随便做做就行了。 十五减去二等于二等于一,共乘以七个二。 因为剩下的一个是7,所以商是7。 可以通过循环实现这个过程。 这样的话,虽然简单,但有问题。 被除数大、除法小时,减法次数过多。 例如(2 ^31-1 ) )/2

稍微调整一下上面的步骤。 上面的例子很直观。 15/2,15不仅大于2,而且大于2的两倍,2的四倍,但小于2的8倍即16,所以要从15中减去8。 8也就是说会减去2的4倍,所以这部分的商品是4。 然后比较剩下的7和除数2。 7大于2,大于2的两倍。 这部分的商品是2。 接下来比较剩下的3和除数2,3大于2,小于2的两倍,所以减去2的两倍等于1。 这部分的商是1,最后剩下的1小于除数2,所以1是多余的。 各个部分的商品加起来可以求出商品有多少。

再画张图更直观点:

与以往不断减少的解法相比,时间的复杂性如何? 我们是为了降低时间的复杂性!

如果被除数为n,除数为c,则n-c*2^(k )=0时,执行了k次,k=log ) n/c )。 这个部分的时间复杂度相当于logn。 每个部分会发生几次呢? 从15到7到3到1,每次都像除以2一样,在2的a次中相当于15。

还需要注意一些问题:

int型的范围为-2 ^31~-2^ 31,因此-2^ 31除以-1会导致溢出或越界,在这种情况下是特殊情况。

在任何类型中,将任意正数转换为负数都不会溢出,因此可以将正数转换为负数,然后用优化算法进行计算,最后根据需要调整符号。

剩下的细节看代码注释就可以了

上传代码:

package com.wzc; //整数是基本的数据类型,编程语言可以提供占用不同内存空间的整数类型,每个类型的整数范围//也不同。 例如,java不能使用具有四种不同整数类型的幂*、除数/和盈馀%:8位byte、16位short、32位int、64//位long/**主题1 :整数除法** *如果发生溢出,则返回最大整数值,假设除数不为0。 例如,15和- 2,15/-2=-7 * */public class divide { publicstaticvoidmain } system.out.println (result ); } publicstaticintdivide (int dividend,int divisor )//溢出情况if ) dividend==0x8000000divisor==-1 ) return integer . //将正数转换为负数。 因为将任意正数转换为负数也不会溢出。 if(dividend0) negative----; dividend=-dividend; (if ) divisor0) negative----; divisor=-divisor; //求商intresult=dividecore(dividend,divisor ); return negative==1? -结果:结果; } privatestaticintdividecore (int dividend,int divisor )/**如果被除数小于除数,则接下来比较被除数是否小于除数的两倍,如果是,则接下来比较是否小于除数的四倍,如此由于每次都将除数加倍,因此时间复杂度*用于在logn * *///result中记录每个子商的总和int result=0。 每次求出while(dividend=divisor )//第一个部分商时,将value恢复为除数,将k复位为1,然后求出下一个部分商int value=divisor; int k=1;//为了防止int型dividend的溢出,因为value值最大为-2的31次方的一半,所以0 xc 00000000 while (value=0xc 00000000 dividend=value ) ) k=k value =value } result =k; dividend -=value; } return result; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。