查找包含自身长度的字符串的长度?

Find length of a string that includes its own length?

我想获取一个字符串的长度,包括代表其自身长度的字符串的一部分,而不使用填充或使用结构或任何类似的强制固定长度的东西。

例如,我希望能够将此字符串作为输入:

"A string|"

和return这个:

"A string|11"

基于 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。这是一个有害的情况。

这是一个棘手的问题,但我认为我已经弄明白了。

在 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:\Users\PH\Desktop>python test.py "tiny|"

小|6

C:\Users\PH\Desktop>python test.py "myString|"

myString|11

C:\Users\PH\Desktop>python test.py "myStringWith98Characters.........................................................................|"

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

只求字符串的长度。然后遍历每个值 位数 结果字符串的长度可能有。迭代时,检查要附加的位数和 初始 字符串长度的总和是否等于 结果 字符串的长度。

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

一个简单的解决方案是:

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'

这是 Bathsheba 回答的简单 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 你就明白了。非常聪明的解决方案!

这里有一个直接方程式(因此没有必要构造字符串)。如果 s 是字符串,则字符串的长度包括附加长度的长度将为:

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

这里的想法是,仅当附加长度将长度推到十的幂以上时,直接计算才有问题;也就是说,在 998999979989999996 等处工作。这样一来,1 + int(log10(len(s)))就是s的长度中的位数。如果我们将其添加到 len(s)9->1098->10099->101 等,但仍然是 8->997->99 等,所以我们可以根据需要完全超过十的幂。也就是说,将其相加会产生一个相加后位数正确的数字。然后再做一次日志,找到那个数字的长度,这就是答案。

要对此进行测试:

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)

这段代码给出了结果。

我用了几个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)