2016-03-04 5 views
-1

Я хочу получить длину строки, включая часть строки, которая представляет свою собственную длину без заполнения или использования структур или чего-либо подобного, что заставляет фиксированные длины.Найдите длину строки, которая включает в себя собственную длину?

Так, например, я хочу, чтобы быть в состоянии взять эту строку в качестве входных данных:

"A string|" 

И вернуть это:

"A string|11" 
+0

Как [тег: рекурсия] Здесь уместно? У вас действительно есть код? Где именно ваша проблема? – jonrsharpe

+0

Проблема «чувствует» рекурсию по мере того, как общая длина строки изменяется, поскольку программа добавляет длину к строке. У меня нет никакого кода, потому что я не могу обернуть голову вокруг какого-либо алгоритма вообще - итеративно или иначе. – pavja2

+0

Какая у вас самая длинная строка? Возможна общая формула, но если ваши строки имеют длину <997, то есть только 3 случая, и их проще просто написать. – tom10

ответ

4

На основе ОП терпя такого подхода (и предоставить технику реализации для возможного ответа 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: \ Users \ PH \ Desktop> python test.py "крошечный"

крошечное | 6

C: \ Users \ PH \ Desktop> питон test.py "MyString |"

туЗЬптд | 11

C: \ Users \ PH \ Desktop> питон test.py «myStringWith98Characters ...................... .................................................. . |»

myStringWith98 Персонажи ............................................ ............................. | 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

Вот простой питон порт ответ Вирсавии:

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))))) 

Идея заключается в том, что прямое вычисление только проблематично, когда добавляются длина будет толкать длину мимо сила десяти; то есть, в 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) 
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) 
Смежные вопросы