GiGiBon level
获赞
3
粉丝
0
关注
0
看过 TA
0
武汉大学
2022
后端
IP属地:贵州
暂未填写个人简介
私信
关注
头像
2020-08-12 08:54
武汉大学 后端
参考文章:https://blog.csdn.net/zl10086111/article/details/80907428一、机器数和真值在学习原码、反码、补码之前,首先要明白机器数和真值的概念。- 一个数在计算机中的二进制形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1。比如,十进制中的 +3,转换为八位二进制为00000011;如果是 -3,就是10000011。- 因为机器数的第一位是符号位,所以机器数的形式值就不一定等于真正的数值。例如上面的10000011,其最高位1代表负数,其真正数值是-3,而不是131。所以,为了区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。二、原码、反码、补码的概念和计算方法1. 原码:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。例如:+1 的原码就是 0000 0001-1 的原码就是 1000 0001原码中,第一位是符号位,所以8位二进制数的取值范围为:[1111 1111, 0111 1111[,即[-127, 127]。2. 反码:反码的表示方法根据正负数进行区分,其中:- 正数的反码就是其本身,例如+1的原码是 0000 0001,反码是 0000 0001。- 负数的反码就是在原码的基础上,符号位不变,其余各位取反。例如,-1 的原码是1000 0001,则反码就是 1111 1110。3. 补码:补码的表示方法根据正负数进行区分,其中:- 正数的补码就是其本身,例如,+1的原码是 0000 0001,反码是 0000 0001,补码是 0000 0001。- 负数的补码是在其源码的基础上,符号位不变,其余各位取反,最后 + 1。例如,1000 0001,反码是 1111 1110,补码是 1111 1111。其实,通过概念我们可以看出:- 正数的原码、反码、补码就是其本身;- 负数的原码、反码、补码是完全不同的。
2020-08-12
在牛客打卡12天,今天学习:刷题 1 道/代码提交 4 次
投递北京创新乐知信息技术有限公司等公司10个岗位
0 点赞 评论 收藏
分享
头像
2020-08-10 08:20
武汉大学 后端
跳台阶题目也是很经典的题目,前面做过了跳台阶的变体,这道题就变得简单了。本质上,这就是“斐波那契数列”的应用,但考察我们对于问题的理解能力。青蛙跳上n级台阶,此时有三种情况:- 当只有1级台阶时(n = 1),此时青蛙跳一次即可完成目标。- 当有2级台阶时(n = 2),此时青蛙可以一次跳一级,也可以一次跳两级,也就是有2种跳法。- 当青蛙跳n级台阶时(n >= 3),我们把n级台阶的跳法比作n的函数:f(n)。这时,我们考虑:如果青蛙第一步跳一级台阶,之后的跳法数目就是之后剩余n-1级台阶的跳法数目,即f(n-1);另一种可能的情况就是青蛙第一步跳两级台阶,之后的跳法数目就是之后剩余的n-2级台阶的跳法数目;所以n级台阶的不同跳法的总数是f(n) = f(n-1) + f(n-2);是不是就是斐波那契数列呀?哈哈,代码也很简单:public int JumpFloor(int target) {        if (target == 1) {            return 1;        } else if (target == 2) {            return 2;        } else {            return JumpFloor(target - 1) + JumpFloor(target - 2);        }}
2020-08-10
在牛客打卡11天,今天学习:刷题 1 道/代码提交 1 次
0 点赞 评论 收藏
分享
头像
2020-08-07 07:11
武汉大学 后端
这道题在刷题的过程中是没做过的,是一个查找的问题。题目没有特别难以理解的立方,旋转数组的概念通过题目也很好理解。题目要求找数组中的最小值,最简单的方法就是暴力寻找(循环),但是这种方法明显没有利用题目中的特点,一个是旋转数组,一个是非递减排序的数组。我们可以想到,旋转数组把一个数组最开始的若干个元素搬到数组的末尾,那么我们在遍历数组的时候可以从数组尾部开始。然后....这样感觉自己还是没有利用到旋转数组和非递减数组这两个条件,这种方法在包里循环中也还是可以加入的......菜的扣脚啊!去偷偷看了牛客网上的回答,这是一个二分查找的变形问题。这道题则考察二分查找的灵活运用,二分查找难就难在array[mid]跟谁比较的问题,一般比较原则有:- 如果有目标值target,则让array[mid]和target比较。- 如果没有目标值,一般考虑端点值。这里我们把target看作是右端点,来进行分析,那就要分析以下三种情况,看是否可以达到上述的目标。- array[mid] > target:当array[mid]比target大时,我们可以推出mid左边的元素都比target大。此时,最小值肯定落在【mid+1, right】中,令 left = mid + 1- array[mid] < target:当array[mid]比target小时,说明最小值肯定不在【mid+1,right】中,但array[mid]可能是最小值,此时,令 right = mid- array[mid] = target:这种情况,不能确定答案在左边还是右边,那么就让last = last - 1;慢慢缩少区间,同时也不会错过答案。所以,明白了上述条件,我们就可以写这个算法的代码了.
2020-08-07
在牛客打卡10天,今天学习:刷题 1 道/代码提交 3 次
投递牛客等公司10个岗位
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务