查找包含自身长度的字符串的长度?
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)))))
这里的想法是,仅当附加长度将长度推到十的幂以上时,直接计算才有问题;也就是说,在 9
、98
、99
、997
、998
、999
、9996
等处工作。这样一来,1 + int(log10(len(s)))
就是s
的长度中的位数。如果我们将其添加到 len(s)
、9->10
、98->100
、99->101
等,但仍然是 8->9
、97->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)
我想获取一个字符串的长度,包括代表其自身长度的字符串的一部分,而不使用填充或使用结构或任何类似的强制固定长度的东西。
例如,我希望能够将此字符串作为输入:
"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)))))
这里的想法是,仅当附加长度将长度推到十的幂以上时,直接计算才有问题;也就是说,在 9
、98
、99
、997
、998
、999
、9996
等处工作。这样一来,1 + int(log10(len(s)))
就是s
的长度中的位数。如果我们将其添加到 len(s)
、9->10
、98->100
、99->101
等,但仍然是 8->9
、97->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)