比天真的O(n * log(n))方法更好的解决方案

时间:2018-02-10 20:30:35

标签: algorithm

您将获得一个仅包含1个字符串的字符串。例如:" 11111111" 你有一个迭代器,当它到达字符串的极端时改变方向。从左到右的方向开始。 迭代器取代了下一个直接的' 1'在它的路径中为零,然后跳到' 1'跟随那个。这种情况一直持续到只有一个' 1'留在字符串中。 你必须打印那个' 1'的位置。

这是一个带有天真解决方案的python 3代码(它还打印了解问题的步骤,尽管预期答案不需要步骤):

n=int(input("enter the number of people in the row : "))
assert(n>=1)
input_string="1"*n
print(input_string)
direction=1
iterator=0
count=0
while(count!=1):
  count=0
  next_to_delete=-1
  while(iterator<len(input_string) and iterator>=0):
    if(input_string[iterator]=='1'):
      if(next_to_delete==-1):
        next_to_delete=iterator
      else:
        input_string=input_string[:iterator]+"0"+input_string[iterator+1:]
        #i.e. input_string[iterator]='0'
        next_to_delete=-1
      count+=1
    iterator+=direction
  print(input_string)
  direction=1 if direction==-1 else -1
  iterator+=direction
print("answer is : ",end='')
print(next_to_delete+1)

示例:

if n=4::::::::::
1111
1010
0010
answer is : 3

if n=5::::::::::
11111
10101
10001
10000
answer is : 1

1 个答案:

答案 0 :(得分:0)

这是一个log(n)解决方案:

def survivor_number(n):
    if n % 2 == 0:
        n -= 1
    b = 2
    t = 1
    while b <= n:
       t += b & n
       b *= 4
    return t

这是基于OEIS中sequence A090569

的算法