2016-03-04 137 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)