2011-12-05 84 views
4

我正在以下codingbat問題:CodingBat sum67:爲什麼這個解決方案是錯誤的?

返回陣列中的數的總和,除了忽略數字區段開頭的6並延伸到下一個7(每6之後,將至少有一個7)。沒有號碼返回0。

sum67([1, 2, 2]) → 5 
sum67([1, 2, 2, 6, 99, 99, 7]) → 5 
sum67([1, 1, 6, 7, 2]) → 4 

我的解決辦法是:

def sum67(nums): 
    sum = 0 
    throwaway = 0 
    for i in range(len(nums)): 
     if throwaway == 0: 
      if nums[i] == 6: 
       throwaway = 1 
     elif throwaway == 1 and i > 0 and nums[i-1] == 7: 
      throwaway = 0 
     if throwaway == 0: 
      sum += nums[i] 
    return sum 

我完全知道這是不是最好的解決辦法,但我只是好奇知道爲什麼這是錯的。你能解釋一下爲什麼這是錯誤的,在哪種情況下它會給出錯誤的結果?

+0

首先,代碼沒有正確縮進,請修復它(我沒有編輯權限;))。 – hochl

+0

你知道'bool'類型嗎? –

+0

'我在範圍內(len(nums))'?伊克! –

回答

5

那麼,你的程序有一個bug。檢查下面的結果:

print sum67([1,2,5]) 
print sum67([1,2,6,5,7]) 
print sum67([1,2,6,5,7,6,7]) 

這將打印:

8 
3 
16 <-- wrong 

如果7之後立即6,您將添加6個及以後的數字。我不確定在輸入中是否允許多個6 ... 7的範圍,但如果是這樣,您必須修正算法。除了

def sum67(nums): 
     state=0 
     s=0 
     for n in nums: 
       if state == 0: 
         if n == 6: 
           state=1 
         else: 
           s+=n 
       else: 
         if n == 7: 
           state=0 
     return s 

,如果你不需要使用索引來進行一些模糊的原因,你可以直接遍歷列表(for element in list: ...)的元素:

這種簡單的實現不會返回正確的數字。

+0

+1:允許多個6-7範圍(有測試);對於OP的解決方案,最簡單的測試用例是'sum67([6,7,6,7]) - > 0' –

+0

謝謝你,我沒有任何理由的過於複雜:如果我添加了「和nums [i]!= 8在第8行,但顯然你的效果要好很多 是的,我使用了一個索引,因爲我想訪問列表中的前一個元素,但是如你所示,這不是必需的。 – Wilco

+0

其實你可以製作我的解決方案中的'state'變量是一個'bool'('True'或'False'),但整數解決方案的優點是可以有兩個以上的狀態,在我看來,它更具教育意義。幫幫我! – hochl

0

這是我對該問題的解決方案。正如已經回答的那樣,問題是在7之後立即發生6。我以稍微不同的方式解決了這個問題,所以我想我會發布它。

def sum67(nums): 
    total = 0 
    i=0 
    while i < len(nums): 
    if nums[i] == 6: 
     while nums[i] != 7: 
     i+=1 
     i+=1 
    if i<len(nums) and nums[i]!=6: 
     total+=nums[i] 
     i+=1 
    return total 
1
public int sum67(int[] nums) { 
int sum=0; 
    for(int i=0; i<nums.length ; i++) 



{ 
      if(nums[i]==6) 
       for(int k=i+1 ; k<nums.length ; k++) 
        {if(nums[k]==7) 
           {i=k; break;} 
        } 
      else if(nums[i]==6) 
       sum=sum+nums[i]; 
      else 
       sum=sum+nums[i]; 


    } 
    return sum; 
} 
1

下面是我供你參考的解決方案:

def sum67(nums): 
flag=False 
sum=0 

for num in nums: 
    if(num==6):     #Turn the flag on if the number is 6 
     flag=True 
     continue 
    if(num==7 and flag is True): #Turn the flag Off when 7 is seen after 6 
     flag=False 
     continue 
    if(flag is False):   #Keep on adding the nums otherwise 
     sum+=num 
return sum 
0

我的解決辦法:

def sum67(nums): 
    result = 0 
    flag = True 
    for num in nums: 
     if num == 6: 
      flag = False 
     if flag: 
      result += num 
     if num == 7: 
      flag = True 
    return result 
0

我知道這是不是最好的解決辦法,但認爲分享到:

def detect67(nums): 
    count = nums.count(6) 
    pos6 = 0 
    pos7 = 0 
    sum1 = [] 
    for i in range (len(nums)): 
    sum1.append(nums[i]) 
    # if I do just sum1 = nums, they use SAME memory locations. 
    #print ("Count=",count) 
    for i in range (count): 
    pos6 = sum1.index(6) 
    pos7 = sum1.index(7) 
    if pos7<pos6: 
    sum1[pos7] = 0 
    pos7 = sum1.index(7) 

    del nums[pos6:pos7+1] 
    del sum1[pos6:pos7+1] 
    count = nums.count(6) 
    if count == 0: 
     return (nums) 



    return (nums) 


def sum67(nums): 

detect67(nums) 
sums=0 
if nums == []: 
    return 0 
for i in range (len(nums)): 
    sums+=nums[i] 
return sums 
相關問題