剑指offer刷题0404

本文提供了解决左旋转字符串、翻转单词顺序、判断扑克牌顺子及求等差数列和等问题的Python实现方法,包括多种技巧如字符串翻转、数组操作及递归算法。
部署运行你感兴趣的模型镜像

左旋转字符串

翻转单词顺序列

扑克牌顺子 

求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

 

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值