【问题标题】:Find length of a string that includes its own length?查找包含其自身长度的字符串的长度?
【发布时间】:2016-03-04 14:57:03
【问题描述】:

我想得到一个字符串的长度,包括字符串的一部分,它代表它自己的长度,而不需要填充或使用结构或任何类似强制固定长度的东西。

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

"A string|"

然后返回:

"A string|11"

【问题讨论】:

  • recursion 与这里有什么关系?你真的有任何代码吗?你的问题到底出在哪里?
  • 当程序将其长度附加到字符串时,字符串的总长度会发生变化,因此问题“感觉”是递归的。我没有任何代码,因为我根本无法理解任何算法——迭代或其他。
  • 你最长的字符串是多少?一个通用的公式是可能的,但如果你的字符串长度
  • 遗憾的是,在我的实现中字符串长度没有上限。我将它用于套接字通信,其中消息的长度(包括描述长度的标头部分)需要在消息内部进行通信。我最终使用了结构,但这限制了我可以根据结构的最大大小发送的数据量,而使用分隔值将允许无限大小的消息。
  • 你能容忍 Java 中的粗略解决方案吗?

标签: python string recursion string-length


【解决方案1】:

在 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 发布基本相同的内容之前,我没有仔细阅读此内容。
  • 我不明白你为什么删除了那个答案。错了吗?
  • 我最终做对了,但我不认为有多个答案都显示相同的算法,只是用不同的语言是一个好主意。 ideal 答案只会以伪代码显示算法;)
【解决方案2】:

一个简单的解决方案是:

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'

【讨论】:

  • 和这里一样,在追加之前最好先计算字符串的长度,特别是对于长字符串。
【解决方案3】:

这是 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,那么你就明白了。非常聪明的解决方案!

【讨论】:

  • 加一;它在 Python 中表现得相当好。
【解决方案4】:

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

在 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

【讨论】:

    【解决方案5】:

    只要找到字符串的长度。然后遍历结果字符串的长度可能具有的 位数 的每个值。迭代时,检查要追加的位数和initial字符串长度的总和是否等于resulting字符串的长度。

    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
    

    【讨论】:

      【解决方案6】:

      这段代码给出了结果。

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

      【讨论】:

        【解决方案7】:

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

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

        这里的想法是,仅当附加长度会将长度推到超过 10 的幂时,直接计算才有问题;也就是说,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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-13
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 2012-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多