2016-03-04 136 views
-1

我想獲得一個字符串的長度,包括表示它自己的長度的字符串的一部分,沒有填充或使用結構或類似強制固定長度的東西。查找包含其自身長度的字符串的長度?

因此,例如,我希望能夠藉此字符串作爲輸入:

"A string|" 

,並返回此:

"A string|11" 
+0

如何[標籤:遞歸]與此有關?你真的有任何代碼?你的問題究竟在哪裏? – jonrsharpe

+0

由於程序將字符串的長度附加到字符串中,因此字符串的總長度會發生變化,因此問題會「感覺」遞歸。我沒有任何代碼,因爲我無法將頭圍繞任何算法 - 迭代或其他方式。 – pavja2

+0

你最長的字符串是什麼?一個通用的公式是可能的,但是如果你的字符串長度<997,那麼只有3個情況,並且把它們寫出來更容易。 – tom10

回答

4

在OP容忍這種做法的基礎上(和爲最終的python答案提供一種實現技術),這裏有一個Java解決方案。

final String s = "A String|"; 
int n = s.length(); // `length()` returns the length of the string. 
String t; // the result 
do { 
     t = s + n; // append the stringified n to the original string 
     if (n == t.length()){ 
      return t; // string length no longer changing; we're good. 
     }      
     n = t.length(); // n must hold the total length 
} while (true); // round again 

,當然的問題是,在附加n,字符串長度的變化。但幸運的是,長度只有增加或保持不變。所以它會很快收斂:由於n長度的對數性質。在這種特殊情況下,n的企圖值是9,10和11.這是一個有害的案例。

+0

在Python中發佈基本相同的東西之前,我沒有仔細閱讀過這篇文章。 – chepner

+0

我不明白你爲什麼刪除了這個答案。它錯了嗎? – Bathsheba

+1

我終於明白了,但我不認爲有多個答案都顯示相同的算法,只是用不同的語言是一個好主意。 *理想*答案只會以僞代碼顯示算法;) – chepner

1

這是一個棘手的,但我認爲我已經想通了。

在Python 2.7匆忙完成,請充分測試 - 這應該處理字符串最多998個字符:

import sys 

orig = sys.argv[1] 

origLen = len(orig) 

if (origLen >= 98): 
    extra = str(origLen + 3) 
elif (origLen >= 8): 
    extra = str(origLen + 2) 
else: 
    extra = str(origLen + 1) 

final = orig + extra 

print final 

非常簡短的測試結果

C:\用戶\ PH \桌面> python test.py「tiny |」

微小| 6

C:\用戶\ PH \桌面>蟒test.py 「的myString |」

的myString | 11

C:\用戶\ PH \桌面>蟒test.py「myStringWith98Characters ...................... .................................................. 。|」

myStringWith98Characters ............................................ ............................. | 101

1

只要找到字符串的長度。然後遍歷每個值的位數所得到的字符串的長度可能有多少。在迭代過程中,檢查要附加的位數和初始字符串長度的總和是否等於結果字符串的長度。

def get_length(s): 
    s = s + "|" 
    result = "" 
    len_s = len(s) 
    i = 1 
    while True: 
     candidate = len_s + i 
     if len(str(candidate)) == i: 
      result = s + str(len_s + i) 
      break 
     i += 1 
3

一個簡單的解決辦法是:

def addlength(string): 
    n1=len(string) 
    n2=len(str(n1))+n1 
    n2 += len(str(n2))-len(str(n1)) # a carry can arise 
    return string+str(n2) 

由於可能進位將最多由一個單元增加長度。

例子:

In [2]: addlength('a'*8) 
Out[2]: 'aaaaaaaa9' 

In [3]: addlength('a'*9) 
Out[3]: 'aaaaaaaaa11' 

In [4]: addlength('a'*99) 
Out[4]: 'aaaaa...aaa102' 

In [5]: addlength('a'*999) 
Out[5]: 'aaaa...aaa1003' 
+0

正如在這裏所做的那樣,最好先計算字符串的長度,然後再進行追加,特別是對於長字符串。 – tom10

2

這裏是拔示巴的回答一個簡單的Python端口:

def str_len(s): 
    n = len(s) 
    t = '' 
    while True: 
     t = s + str(n) 
     if n == len(t): 
      return t 
     n = len(t) 

這是比任何我想嘗試一個更聰明的和簡單的方式!

假設你有s = 'abcdefgh|,在第一次通過,t = 'abcdefgh|9 由於n != len(t)(也就是現在的10),它通過再次:t = 'abcdefgh|' + str(n)str(n)='10'讓你有abcdefgh|10它仍然是不完全正確!現在n=len(t)這是最後n=11你得到它的權利然後。非常聰明的解決方案!

+0

加一;它在Python中非常漂亮。 – Bathsheba

0

這是一個直接的公式(所以沒有必要構造字符串)。如果s是字符串,則該字符串的長度,包括附加的長度的長度將是:

L1 = len(s) + 1 + int(log10(len(s) + 1 + int(log10(len(s))))) 

這裏的想法是,直接計算只是問題的時候附加的長度將推動長度過去十的力量;也就是說,在998999979989999996等若要此通過,1 + int(log10(len(s)))是數字在s長度的數目。如果我們加上len(s),那麼9->10,98->100,99->101等,但仍然是8->9, 97->99等,所以我們可以根據需要推出超過10的冪。也就是說,添加後會產生一個具有正確數字位數的數字。然後再次執行日誌查找該數字的長度,這就是答案。

爲了測試這個:

from math import log10 

def find_length(s): 
    L1 = len(s) + 1 + int(log10(len(s) + 1 + int(log10(len(s))))) 
    return L1 

# test, just looking at lengths around 10**n 
for i in range(9): 
    for j in range(30): 
     L = abs(10**i - j + 10) + 1 
     s = "a"*L 
     x0 = find_length(s) 
     new0 = s+`x0` 
     if len(new0)!=x0: 
      print "error", len(s), x0, log10(len(s)), log10(x0) 
0

此代碼給出結果。

我用了幾個var,但最終它表明你想要的輸出:

def len_s(s): 
    s = s + '|' 
    b = len(s) 
    z = s + str(b) 
    length = len(z) 
    new_s = s + str(length) 
    new_len = len(new_s) 
    return s + str(new_len) 

s = "A string" 
print len_s(s)