剑指offer刷题0404

左旋转字符串

翻转单词顺序列

扑克牌顺子 

求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

猜你喜欢

转载自blog.csdn.net/wangwangstone/article/details/89012440