2016-04-23 177 views
0

我想要一個數字,並返回一個字符串與任何奇數週圍的破折號。此外,該字符串不應以短劃線開頭或結尾。爲什麼這個ruby代碼不能返回任何東西?

我已經寫了下面的,但它不返回任何東西:

def dasherize_number(num) 
    string = num.to_s 
    i = 0 

    while i<string.length 
    if (string[i].to_i % 2) != 0 
     string[i] = '-' + string[i] + '-' 
    end 
    i += 1 
    end 

    if string[0] == '-' 
    string.pop(1) 
    end 

    if (string.length - 1) == '-' 
    string.pop(1) 
    end 

    string 
end 

看來,如果我理解正確的話可以無限循環;控制檯顯示沒有輸出,並且不允許我做任何事情,除非我刷新。我已經查看了每個角色的代碼,但我無法確定它出錯的地方。

+0

正如作者在他/她的問題中提到的,該方法已在控制檯中調用。 @ hac13在下面看到我的答案。問題似乎是在'while'循環中。 – Uzbekjon

+0

@Uzbekjon OP說在控制檯中調用該方法的位置? – sawa

+0

我不太確定一個方法的'調用'是什麼意思,但是如果它意味着運行它 - 我輸入了'dasherize_number(4567)'並且控制檯不允許我做其他事情 – hac13

回答

1

您的代碼中存在很多邏輯問題。 這裏的東西,可能只是爲了工作,你

def dasherize_number(num) 
    string = num.to_s 
    str_len = string.length 

    i = 0 

    while i < str_len 
    next if string[i] == '-' 
    if (string[i].to_i % 2) != 0 
     string[i] = '-' + string[i] + '-' 
     str_len = string.length 
     i += 3 
    else 
     i += 1 
    end 
    end 

    if string[0] == '-' 
    string = string[1..-1] 
    end 

    if (string[string.length - 1]) == '-' 
    string = string[0..-2] 
    end 

    string.gsub('--', '-') 
end 

  1. 首先,你必須在你的while循環這個條件i < string.length 這是行不通的,因爲字符串的長度不斷變化。所以我使用了一個變量來存儲這個值並且在字符串被更新時更新變量。

  2. 如果更新字符串,我們可以確定我們可以跳過下兩個索引。 例如:number inputed - > 122 然後第一次迭代後字符串將是-1-22 因此,我們不想爲下一個索引運行相同的條件,因爲這將再次爲1,因此是無限循環。 (希望你明白了)

  3. pop對字符串不起作用,僅僅因爲我們可以使用像數組這樣的索引來訪問字符,所以我們不能使用pop作爲字符串。

  4. 爲了確保沒有連續的破折號,我用gsub用單個破折號代替它們。

+0

它都是有道理的。我現在看到它。唯一的麻煩是當有兩個相鄰的奇數時,我會得到一個額外的短劃線。我的錯不在那裏。當我爲(333)調用函數時,我得到'3--3--3'而不是'3-3-3';兩者之間只需要一個短劃線。 – hac13

+0

@ hac13請參閱上次編輯。這應該刪除連續的破折號 – Alfie

+0

魔術!這是失蹤的一塊,另一個新的事情學習 – hac13

0

這個問題似乎是在這部分代碼:

while i<string.length 
    if (string[i].to_i % 2) != 0 
     string[i] = '-' + string[i] + '-' 
    end 
    i += 1 
end 

如果您string包含奇數它由2個字符(2個-)增加了它的長度,但由1遞增它(i+=1) 。

將初始字符串長度分配給var,並在while循環中檢查其長度。

string_length = string.length 

while i < string_length 
    if ((string[i].to_i % 2) != 0) 
     string[i] = '-' + string[i] + '-' 
    end 
    i += 1 
end 
+1

你測試了這段代碼嗎?我想這裏給你一個驚喜...... :) –

+0

不,我沒有。我只是指出了我可以發現的邏輯問題。其餘的,我認爲是問題作者的工作。但是,現在你讓我感興趣! :)分享你還能發現什麼? – Uzbekjon

+0

我看到...... if()周圍的'()'!葉氏! :) – Uzbekjon

相關問題