中级编程通关练习题 #6 – 二进制操作符做加法

给定两个正整数 a 和 b,使用二进制操作符而不是加法操作符来计算它们的和。 输入样例: a = 105,b = 201 输出样例: 306 算法思路: 方法一:从低位到高位逐一计算每个bit相加之后的结果。当两个bit都是1时,使用 & 操作符可以得到进位bit值。否则,使用 ^ 操作符可以得到两个bit的和。进位bit的值使用左移操作符<<可以继续和下一个bit来计算。方法二:使用^ 操作符得到两位数值不包含同位bit都是1的相加之和 A。使用& 操作符加左移操作符<<得到进位数值 B。如果进位数值B为零,则返回前面的相加之和A,否则用A和B重复上述操作,直到B为零。

中级编程通关练习题 #5 – 二项展开式

给定一个字符串包含数学算式(ax + b)^ n,a 和 b都是整数,n 为正整数。实现一个函数把它做二项式展开。譬如,字符串"(-2x-3)^5" 做二项式展开后的结果是: -32x^5-240x^4-720x^3-1080x^2-810x-243。 输入样例: "(-3y+5)^7" 输出样例: -2187y^7+25515y^6-127575y^5+354375y^4-590625y^3+590625y^2-328125y+78125 算法思路: 首先使用正则表达式把字符串中需要的数值和数学符合提取出来然后按照二项式的计算公式将它展开,注意下面的特殊情况如果 n 是 0,那么返回值是 1如果 n 是 1, 那么返回值是 ax + b如果 b 是 0, 那么返回值是…

初级编程通关练习题 #14 – 搜索最小数值

给定一个正整数,在只能将其中的一个数字移位的条件下,找出移位后该正整数新的最小数值,以及应该移位的数字的前后位置索引。 输入样例: 201220071860373372 输出样例: [12200271860373372, 0, 6] 上面的输入样例中,正整数 201220071860373372 的第一位数字 2 (索引为 0)移动到第7个位置(索引为6),可以得到最小数值 12200271860373372。 算法思路: 循环检查正整数的每一个数字,将该数字从前移动到最后,逐一比较得到的新数值,保留最小的数值以及移动的位置。

初级编程通关练习题 #13 – 匿名函数搜索字符串

给定两个字符串列表 arr1 和 arr2,检查列表 arr1 里面的每一个字符串是否包含在列表 arr2里面的字符串中。实现一个函数以 arr1 和 arr2 为参数,返回arr1的字符串可以在 arr2找到的列表,如果都找不到就返回空列表。 编码要求:使用lambda 匿名函数单行完成上面的搜索,并返回结果。全部代码长度不能超过65个字符。 输入样例: arr1 = ["load", "day", "sun", "gone"]arr2 = ["secret", "keep loading", "harvest", "sunshine", "holiday"] 输出样例: ['day',…

初级编程通关练习题 #12 – 寻找立方数

给定一个字符串里面包括有文字和数字,请编写一个函数把其中的数字全部提取出来,如果连续数字超过3个,需要分成两个数字或以上的数,然后查看每一个数字是否是立方数。所谓立方数,就是一个多位数的每一个数字立方之和等于它本身,譬如:数字 407是立方数,因为 43 + 03 + 73 = 407。函数的返回值就是所有立方数列表。 输入样例: "407233-0abde22479,ip address:153.254.162.107" 输出样例: [407, 0, 153, 560] 算法思路: 首先可以利用正则表达式从字符串中提取所有的数字,提取数字时每个数字的长度在1到3之间。检查提取出来的每个数字,如果是立方数就加入到函数返回列表中

入门级编程通关练习题#19、#20、#21

Level-0_#19 条件判断语句纠错 下面的过马路函数根据传入的红绿灯参数值判断车辆是否可以通过路口,如果是红灯或者黄灯就返回 false,否则就返回 true。函数代码里面有语法错误,请修改。 Level-0_#20 函数返回字符串 实现一个visit函数,根据传入的参数place 来返回下面的一句话:“I'm going to visit <place> for this summer.”,其中<place>需要用参数 place的内容来替换。 Level-0_#21 函数返回负数 实现一个函数 negative,把传入的参数 integer 变成负数返回,如果传入的参数值是零或者负数,就保持不变。 输入样例: 10 输出样例:-10

高级编程通关练习题 #2:解析数学表达式

以字符串形式给定一条有效的数学表达式,使用字符串解析的方式计算该表达式的结果。注意不能使用 eval 方法来得出结果。 表达式的规则如下: 表达式里可能出现的数学操作符为:加(+)、减(-)、乘(*)、除(/)可能的数值包括正负数和小数需要分析可能出现的多重小括号,譬如:(15 * (9.5 + 6)- -10)/ 4 输入样例: "(-7 * -(16 / 4)) * (9.5 - 4.5)" 输出样例: 140.0 算法思路: 方法一:可以采用数据结构stack来逐一处理每个字符如果字符是数字或小数点,则添加到到临时字符串变量A中。如果字符不是数字或者小数点,则把临时变量A中的字符串转换成数字,然后压栈。如果是字符是数学操作符加减乘除或左小括号,就把该字符压栈。如果字符是右小括号,那么需要从栈顶弹出数值和操作符保存到临时变量B,直到遇到左小括号为止,然后将字符串B做数学计算。数学计算的顺序如下:先计算除法,然后计算乘法,接下来计算减法,最后计算加法。字符串循环读取完毕后,检查stack栈内是否为空,如果不为空则需要将栈内内容重复上面第三项操作。方法二:使用正则表达式来解析字符串以左右小括号为标志先后解析需要计算的表达式提取数学操作符和数值后做相应处理

高级编程通关练习题 #1:匿名函数计算两圆相交面积

给定两个有相同半径R的圆中心点的位置A、B,计算这两个圆相交部分的面积。Python编码要求:使用匿名函数单行完成全部计算,总代码的字符长度不能超过128位。 譬如上面两个圆的半径都是 5,圆心的位置分别是(0,0)和(6,0),相交的绿色部分面积为22.365。计算绿色面积的思路:用圆心到两圆相交两点的扇形面积减去圆心到两圆相交两点三角形面积。如下图所示,黄色加绿色的扇形面积减去黄色三角形面积,就是两圆相交面积的1/2。 首先计算两圆中心之间的距离和相交点位置坐标的公式如下: 上面的 d 为两圆中心点之间的距离,x,y 为两圆相交点的平面坐标位置,算式中的 Ax、Ay为圆A的中心坐标,Bx、By为圆B的中心坐标,Ar为圆A的半径,Br为圆B的半径。然后我们需要计算两个扇形面积,以及两个三角形的面积: 注意上面的两个圆的半径 Ar 和Br 在这里是相等的,所以两个扇形面积 areas,1 和 areas,2是一样的,两个三角形面积 areat,1 和 areat,2 也是相等的。 上面的算式转换后就可以得到两圆相交面积(上图绿色部分)的计算公式如下: 根据上面的计算公式,在两圆半径相等,也就是 Ar 等于 Br 时,相应的Python代码如下: 上面的代码样例中,函数 intersected_area 的参数 a、b分别为两个圆的圆心坐标,r…

初级编程通关练习题 #10 – 匿名函数陷阱

我们在使用Python的匿名函数时,经常会生成临时函数然后在后面再调用,但是如果不注意就会出现意想不到的错误,譬如下面的代码: 我们期望看到的结果是 0、3、6、9,但是实际上显示出来的却是四个 9。 请修改上面的匿名函数代码,让下面循环调用函数 f(3)的结果为 0、3、6、9。 解决思路: 这个问题的本质是Python函数变量作用域里的闭包实现方式所导致的。解决的方法有如下几种:使用函数工厂模式使用函数默认参数使用 eval 方法使用 yield 方法使用 partial 方法使用 tuple