如何在不使用字符串方法的情况下去除 Python 中的空格?
How to strip white spaces in Python without using a string method?
我对编程还很陌生,一直在通过 HackerRank 学习一些资料。但是,我目前遇到了这个 objective 或挑战。我已经尝试了几件事,但仍然无法弄清楚我到底做错了什么。
Objective:读取N并输出0到N之间的数字不带空格或使用字符串方式
N = int(input())
listofnum = []
for i in range(1, N +1):
listofnum.append(i)
print (*(listofnum))
输出:
1 2 3
不使用任何字符串方法,仅使用整数除法和list
反转数字,使用sys.stdout.write
打印它们:
import sys
N = int(input())
for i in range(1,N+1):
l=[]
while(i):
l.append(i%10)
i //= 10
for c in reversed(l):
sys.stdout.write(chr(c+48))
或者如 tdelaney 所建议的,一种更加硬编码的方法:
import os,sys,struct
N = int(input())
for i in range(1,N+1):
l=[]
while(i):
l.append(i%10)
i //= 10
for c in reversed(l):
os.write(sys.stdout.fileno(), struct.pack('b', c+48))
所有这些都非常有趣,但最好的方法是使用具有生成器理解的单行代码,使用 str.join()
和 str
构造:
"".join(str(x) for x in range(1,N+1))
每个数字都转换成字符串,join
运算符只是将所有数字与空分隔符连接起来。
您可以将 print()
的 sep
参数用于 "bind" 列表理解中的每个数字:
>>> print(*[el for el in range(0, int(input())+1)], sep="")
10
012345678910
>>>
试试''.join([str(i) for i in range(N)])
N = int(input())
answer = ''
for i in range(1, N + 1):
answer += str(i)
print(answer)
这是我能想到的最接近 'not using any string methods' 的方法,尽管从技术上讲它是在后台使用 str.__new__/__init__/__add__
或其他等效方法。我当然认为它比使用 ''.join
.
更符合问题的要求
完成此操作的一种方法是将数字附加到空白字符串。
out = ''
for i in range(N):
out += str(i)
print(out)
你必须做一个简单的数学运算才能做到这一点。他们期望做的是将每个列表元素乘以 10 的幂并将它们相加。例如,假设您有一个数组;
一 = [2,3,5]
你需要输出;
235
然后将每个循环元素从右到左乘以 10^0、10^1 和 10^2。你在创建字符串列表后编写此代码。
a = map(int,a)
for i in range(len(a)):
sum += (10**i)*a[-i]
print sum
大功告成!
您可以在循环内打印数字。只需在 print
:
中使用 end
关键字
print(i, end="")
我对编程还很陌生,一直在通过 HackerRank 学习一些资料。但是,我目前遇到了这个 objective 或挑战。我已经尝试了几件事,但仍然无法弄清楚我到底做错了什么。
Objective:读取N并输出0到N之间的数字不带空格或使用字符串方式
N = int(input())
listofnum = []
for i in range(1, N +1):
listofnum.append(i)
print (*(listofnum))
输出:
1 2 3
不使用任何字符串方法,仅使用整数除法和list
反转数字,使用sys.stdout.write
打印它们:
import sys
N = int(input())
for i in range(1,N+1):
l=[]
while(i):
l.append(i%10)
i //= 10
for c in reversed(l):
sys.stdout.write(chr(c+48))
或者如 tdelaney 所建议的,一种更加硬编码的方法:
import os,sys,struct
N = int(input())
for i in range(1,N+1):
l=[]
while(i):
l.append(i%10)
i //= 10
for c in reversed(l):
os.write(sys.stdout.fileno(), struct.pack('b', c+48))
所有这些都非常有趣,但最好的方法是使用具有生成器理解的单行代码,使用 str.join()
和 str
构造:
"".join(str(x) for x in range(1,N+1))
每个数字都转换成字符串,join
运算符只是将所有数字与空分隔符连接起来。
您可以将 print()
的 sep
参数用于 "bind" 列表理解中的每个数字:
>>> print(*[el for el in range(0, int(input())+1)], sep="")
10
012345678910
>>>
试试''.join([str(i) for i in range(N)])
N = int(input())
answer = ''
for i in range(1, N + 1):
answer += str(i)
print(answer)
这是我能想到的最接近 'not using any string methods' 的方法,尽管从技术上讲它是在后台使用 str.__new__/__init__/__add__
或其他等效方法。我当然认为它比使用 ''.join
.
完成此操作的一种方法是将数字附加到空白字符串。
out = ''
for i in range(N):
out += str(i)
print(out)
你必须做一个简单的数学运算才能做到这一点。他们期望做的是将每个列表元素乘以 10 的幂并将它们相加。例如,假设您有一个数组; 一 = [2,3,5] 你需要输出; 235
然后将每个循环元素从右到左乘以 10^0、10^1 和 10^2。你在创建字符串列表后编写此代码。
a = map(int,a)
for i in range(len(a)):
sum += (10**i)*a[-i]
print sum
大功告成!
您可以在循环内打印数字。只需在 print
:
end
关键字
print(i, end="")