左旋转字符串
翻转单词顺序列
扑克牌顺子
求1+2+3+...+n
左旋转字符串
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
##方法一:用多次翻转,自己写的,虽然比较难看,但还是通过啦
# -*- coding:utf-8 -*-
class Solution:
def LeftRotateString(self, s, n):
# write code here
#思路: 先将前n个翻转,再将后n-s个翻转,再整体以中间值翻转即可
if not s:
return "" #为空,只能返回空,不能用None代,否则报不能完全通过
s_list=list(s)
if n>len(s):
return None
def Reverse(a):
m=len(a)
if m==0 or m==1:
return a
s=m/2
if(s>int(s)): #奇数
for i in range(int(m/2)+1):
temp=a[i]
a[i]=a[m-1-i]
a[m-1-i]=temp
else:
for i in range(int(m/2)):
temp=a[i]
a[i]=a[m-1-i]
a[m-1-i]=temp
return a
s_n=s_list[:n]
s_n_revers=Reverse(s_n)
print("s_n_revers的结果是:{}".format(s_n_revers))
s_right=s_list[n:]
s_right_revers=Reverse(s_right)
print("s_left_revers:{}".format(s_right_revers))
ss=s_n_revers+s_right_revers
revers_s=Reverse(ss)
revers_final="".join(revers_s)#以字符串格式输出
return revers_final
##注意将元素为字符的列表转换为字符串的方法,用"".join
##注意将元素为字符的列表转换为字符串的方法,用"".join
str_list = ['X', 'Y', 'Z', 'd', 'e', 'f', 'a', 'b', 'c']
print("".join(str_list)) #输出XYZdefabc
num_list=[2,3,4] #如果为元素为数字则不可以用"".join方法
# print("".join(num_list))#此会报错
num_list_new = [str(x) for x in num_list]#需要先转换一下
print("".join(num_list_new))#234,但是里面元素已经为str类型了
看看人家的代码:
##仍然用多次翻转,但是瞅瞅人家代码就简洁很多了!
# -*- coding:utf-8 -*-
class Solution:
def LeftRotateString(self, s, n):
if not s:
return ''
s = list(s)
s = self.reverse_array(s, 0, n-1)
s = self.reverse_array(s, n, len(s)-1)
s = self.reverse_array(s, 0, len(s)-1)
return ''.join(s)#返回字符串
def reverse_array(self, array, start, end): #函数的定义上,多个参数,比自己的考虑就
print(start, end)
while start < end:#这个比自己的用去判断奇偶性好多了,直接利用python的
array[start], array[end] = array[end], array[start]#直接利用python的赋值
start += 1
end -= 1
return array
#一行解决系列:
class Solution:
def LeftRotateString(self, s, n):
return s[n:] + s[:n]
翻转单词顺序列
题目描述:
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路 要注意空格符的识别。翻转整个数组再翻转单个单词
# -*- coding:utf-8 -*-
class Solution:
def ReverseSentence(self, s):
if not s:
return ""
s = list(s)
# 第一步,翻转整个数组
s = self.reverse_array(s, 0, len(s)-1)
end = 0
# 第二步,翻转各个单词
while end < len(s):
if s[end] == ' ':
end += 1
else:
start = end
while end < len(s) and s[end] != ' ':
end += 1
s = self.reverse_array(s, start, end-1)
return ''.join(s)
def reverse_array(self, array, start, end):
while start < end:
array[start], array[end] = array[end], array[start]
start += 1
end -= 1
return array
扑克牌顺子
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
思路:
##注意,此排序时就干脆直接调用python的sort算了,没必要再去手写了。 大小王可以视作0,然后把数组排序。从头开始读数组,统计0的个数,然后读后面的数字,相邻两个数字之间如有间隔差值,则用0的个数来填补,如果后面的数字本来就是连续的则肯定ok,如果中间有不连续且刚好能被0填补,则也是顺子。
# -*- coding:utf-8 -*-
##注意,此排序时就干脆直接调用python的sort算了,没必要再去手写了
class Solution:
def IsContinuous(self, numbers):
if not numbers:
return False
numbers.sort()
num_of_0 = 0
for i in range(0, len(numbers)-1):
if numbers[i] == 0:
num_of_0 += 1
else:
delta = numbers[i+1] - numbers[i]
if delta < 1:
return False
elif delta > 1:
num_of_0 -= (delta - 1)
if num_of_0 < 0:
return False
return True
求1+2+3+...+n
题目描述 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
思路: 递归,但利用短路原理来作为递归终止的条件。当&&先左半边判断ans为0后,右边就不执行了,实现了递归的终止
注意 temp= a and b 的表达式,如果a为0,则右边不判断了,如果a不为0,则将b的值赋给temp
# -*- coding:utf-8 -*-
class Solution:
def Sum_Solution(self, n):
ans = n
temp = ans and self.Sum_Solution(n-1)
ans = ans + temp
return ans