剑指offer10-12题

第十题:矩形覆盖

通过分析可以知道这道题的本质其实是"飞不拉稀"数列。第一次放的话有两种放法:
法1:竖着放,此时剩余有f(n-1)种方法;
法2:横着放,此时,下面的那个位置必须横着放一个1*2的矩形,剩余(n-2)*2的矩形有f(n-2)种方法;
故f(n) = f(n-1)+f(n-2),通过递归求解。另外要给出递归终止的条件。代码如下:
在这里插入图片描述

第十一题:二进制中1的个数

这道题,主要考查的时位运算,这就触及到我的知识盲区了!
首先复习一下原码、反码、补码。(8位bit)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

在这里插入图片描述也就是说,虽然我们在写程序的时候看到的是我们熟悉的十进制数,但是计算机在做运算时是基于补码。
详情参考:https://www.jianshu.com/p/36ec7a047f29

另外位运算包括:与、或、非、左移和右移。
与:同1为1,其余为0;
或:有1为1,其余为0;
非:1变0,0变1; 如a=0101 1000 ,则!a=1010 0111.
左移:<< , 左边最高位丢弃,右边补齐0 ;
右移:>> , 最高位是0,左边补齐0;最高为是1,左边补齐1 ;

在这里插入图片描述
如上图,我们用count来统计1的个数,flag来判断是否比较完待比较数字的所有位。通过让n与flag做与运算,来判断当前比较位是否是1;通过左移flag来比较下一位。

第十一题:数值的整数次幂

在前几天学习上课的时候后,老师讲过一个通过递归求整数次幂的方法,然后就有了下面的代码。
注意:1.判断当前的底数是正数还是负数,如果是负数要先算其绝对值的幂,然后取倒数。
2.要判断幂次是不是偶数,具体处理见图。在这里插入图片描述

第十二题:调整数组中的数值,使奇数在前,偶数在后(奇数、偶数的相对顺序不改变)

这道题思路很简单,但是却又不知道如何下手。开始自己用了最笨的办法,就是依次取出array中的数,然后取出的时候判断是奇数还是偶数,将奇数和偶数分开存数,最后将存储偶数的数组中的偶数依次添加到存储奇数的数组里。最后将这个奇数数组赋值给array。不过这样的空间复杂度好像有点高。

发布了12 篇原创文章 · 获赞 6 · 访问量 128

猜你喜欢

转载自blog.csdn.net/qq_38041105/article/details/105079786