我是Python的初学者,自学Google代码大学。我把这个问题作为练习,并且能够使用下面显示的解决方案来解决它:
# F. front_back
# Consider dividing a string into two halves.
# If the length is even, the front and back halves are the same length.
# If the length is odd, we'll say that the extra char goes in the front half.
# e.g. 'abcde', the front half is 'abc', the back half 'de'.
# Given 2 strings, a and b, return a string of the form
# a-front + b-front + a-back + b-back
def front_back(a, b):
if len(a) % 2 == 0:
ad = len(a) / 2
if len(b) % 2 == 0:
bd = len(b) / 2
else:
bd = (len(b) / 2) + 1
else:
ad = (len(a) / 2) + 1
if len(b) % 2 == 0:
bd = len(b) / 2
else:
bd = (len(b) / 2) + 1
return a[:ad] + b[:bd] + a[ad:] + b[bd:]
这会产生正确的输出并解决问题。但是,我重复了是否均匀分割字符串或将奇数加到前半部分的逻辑,这似乎是多余的。必须有一种更有效的方法来做到这一点。同样的检查和逻辑正在应用于a和b。任何人吗?
答案 0 :(得分:12)
def front_back(a, b):
ad = (len(a) + 1) // 2
bd = (len(b) + 1) // 2
return a[:ad] + b[:bd] + a[ad:] + b[bd:]
使用//
进行除法使得此代码可以在Python 2.x和3.x中使用。
答案 1 :(得分:4)
好吧,把它放在一个单独的函数中。
def front_back(string):
offset = len(string) / 2
if len(string) % 2 != 0:
offset += 1
return string[:offset], string[offset:]
def solution(a, b):
front_a, back_a = front_back(a)
front_b, back_b = front_back(b)
return front_a + back_a + front_b + back_b
答案 2 :(得分:3)
因为如果它是奇数,你加长1,而'奇数'意味着len(a)%2 == 1
......
def front_back2(a, b):
ad = (len(a) + len(a)%2) / 2
bd = (len(b) + len(b)%2) / 2
return a[:ad]+b[:bd]+a[ad:]+b[bd:]
当然,你甚至可以将它压缩到一行只是为了踢(虽然它的可读性差得多):
def front_back2(a, b):
return a[:(len(a)+len(a)%2)/2]+b[:(len(b)+len(b)%2)/2]+a[(len(a)+len(a)%2)/2:]+b[(len(b)+len(b)%2)/2:]
答案 3 :(得分:2)
您可以使用ceil
In [1]: l = [1,2,3]
In [2]: import math
In [4]: math.ceil(len(l)/2.0)
Out[4]: 2.0
In [5]: l.append(4)
In [6]: math.ceil(len(l)/2.0)
Out[6]: 2.0
In [7]: l.append(5)
In [8]: math.ceil(len(l)/2.0)
Out[8]: 3.0
In [9]: l[0:3]
Out[9]: [1, 2, 3]
In [10]: l[3:]
Out[10]: [4, 5]
答案 4 :(得分:2)
Mhh试图理解@Sven回答我得到了这个:
len( s ) + 1 / 2
始终会为您提供正确的索引。
所以如果我们把它放在一个函数中:
def d( s ):
return ( len(s) + 1 ) / 2
我们可以在解决方案中使用它:
def front_back( a, b ):
return a[:d(a)] + b[:d(b)] + a[d(a):] + b[d(b):]
好的,我现在知道了。
我不太确定/
和//
之间的区别是什么
答案 5 :(得分:1)
from math import ceil
def front_back(a, b):
divide = lambda s: int(ceil(len(s) / 2.0)) # or lambda s: (len(s) + 1) // 2
a_divide, b_divide = divide(a), divide(b)
return a[:a_divide] + b[:b_divide] + a[a_divide:] + b[b_divide:]
答案 6 :(得分:1)
这是我的:
def front_back( a, b ) :
return of(a)[0] + of(b)[0] + of(a)[1] + of(b)[1]
def of( s ):
index = len( s ) / 2 + ( 1 if len( s ) % 2 == 1 else 0 )
return ( s[ : index ] , s[ index : ] )
print front_back('abcde','hola')
打印:
abchodela