今天的两道题目有一道似曾相识,属于leetcode里面middle的题目,另外一道完全想不到…
¶第一题
L, R = 0, 1
对于一个数N,L, R 可以经过任意次数变换,变换的规则为
L = L * 2 - R
R = R * 2 - L
那么为了得到N,所需要的最小步数是多少?
- 举个例子,如果是11, 那么[LRLR] 就可以得到
- 如果是-11, 那么最少步数为4,[LLRL]
分析:首先需要区别正负进行不同的变换操作,那么先从正数开始,显然0
,1
已经有了
对于2的指数,可以一直R下去
- 2 --> R
- 4 --> RR
那么比如3,我们就要构造出2*1 -(-1)
的操作, 5的话2 * (1) - (-3)
,也就是说在最后一步我们需要通过R操作得到正数。
对于负数,-1 --> L
, -2 --> RL
,-3 --> LL
对于2的指数,同样前面进行多次R操作,最后一步是L
思路:对于正数的时候,视情况进行左右变换,由此可以进行位运算来判断是否左还是右,因此选择1作为比较。
1 | def solution(N): |
¶第二题
找座位,leetcode849类似
对于一个0-N
的list,A[0] = 10, A[1] = 8, A[2] = -3,其对应的值可以想象成数轴上的点
那么对于一个给定的list,能不能在数轴上找到一个点,使得离它最近的点的距离是最大的,问最大的距离是多少?
思路:leetcode上是直接给了索引好的list,[0,1,1,1,0,0,0,1] 0表示没人坐,1表示有人了,那么这里只需要将数组做一下转化就行了
1 | def solution(A): |