博客
关于我
牛客网——python之剑指0ffer之67道在线编程——jz41-jz50
阅读量:349 次
发布时间:2019-03-04

本文共 4227 字,大约阅读时间需要 14 分钟。

jz41 和为S的连续正数序列

问题描述

小明需要找出所有和为100的连续正数序列。例如,9~16的和为100,18,19,20,21,22的和也为100。现在,你需要编写一个函数,找出所有满足条件的连续正数序列,并按照从小到大的顺序输出。

思路分析

可以使用左右指针法来解决这个问题。左指针从1开始,右指针从2开始。通过不断调整两个指针的位置,计算当前区间的和,直到找到和等于目标值的序列。具体步骤如下:

  • 初始化两个指针,左指针i=1,右指针j=2。
  • 计算当前区间的和sum = i + i+1 + ... + j。
  • 如果sum小于目标值tsum,右指针j增1。
  • 如果sum大于tsum,左指针i增1。
  • 如果sum等于tsum,记录当前序列,左指针和右指针都增1,继续寻找下一个可能的序列。
  • 代码实现

    class Solution:    def FindContinuousSequence(self, tsum):        i, j, result = 1, 2, []        while j <= (tsum + 1) // 2:            current_sum = sum(range(i, j + 1))            if current_sum < tsum:                j += 1            elif current_sum > tsum:                i += 1            else:                result.append(range(i, j + 1))                i += 1                j += 1        return result

    jz42 和为S的两个数字

    问题描述

    给定一个递增排序的数组和一个数字S,找出两个数使得它们的和等于S。如果有多个解,返回乘积最小的那一对(按从小到大的顺序输出)。

    思路分析

    使用双指针法,左指针从数组起点开始,右指针从数组终点开始。具体步骤如下:

  • 初始化左指针i=0,右指针j=最后一个元素。
  • 计算左指针和右指针的和。
  • 如果和等于目标值S,返回这对数。
  • 如果和大于S,右指针减1。
  • 如果和小于S,左指针加1。
  • 代码实现

    class Solution:    def FindNumbersWithSum(self, array, tsum):        if not array:            return []        i, j = 0, len(array) - 1        while i < j:            current_sum = array[i] + array[j]            if current_sum == tsum:                return [array[i], array[j]]            elif current_sum > tsum:                j -= 1            else:                i += 1        return []

    jz43 左旋转字符串

    问题描述

    模拟汇编语言中的循环左移操作,将字符串左移K位。例如,字符串“abcXYZdef”左移3位后变成“XYZdefabc”。

    思路分析

    字符串循环左移K位可以通过字符串切片实现。将字符串分为两部分,后半部分加上前半部分即可得到结果。

    代码实现

    class Solution:    def LeftRotateString(self, s, n):        return s[n:] + s[:n]

    jz44 翻转单词顺序

    问题描述

    对句子中的单词顺序进行翻转。例如,“student. a am I”翻转后变成“I am a student.”

    思路分析

    将句子拆分成单词列表后,直接反转列表并重新拼接即可得到翻转后的句子。

    代码实现

    class Solution:    def ReverseSentence(self, s):        words = s.split(' ')        return ' '.join(words[::-1])

    jz45 扑克牌顺子

    问题描述

    判断抽出的5张牌是否能组成顺子。大小王可以看作0或4,但在这个问题中视为0和4。

    思路分析

    将牌的数字转换为统一的数字(大小王视为0),然后检查是否存在长度为4的连续数字序列。

    代码实现

    class Solution:    def IsPokerSequence(self, cards):        converted = []        for card in cards:            if card == '大王':                converted.append(0)            elif card == '小王':                converted.append(4)            else:                converted.append(int(card))        target = [0, 4, 1, 2, 3, 4]        for i in range(len(converted) - 4 + 1):            if converted[i:i+5] == target:                return True        return False

    jz46 孩子们的游戏

    问题描述

    小朋友围成一个大圈,编号从0开始,随机指定一个数m。编号为0的小朋友开始报数,每次m-1的那个小朋友出列。最后剩下的数即为答案。

    思路分析

    这个问题可以转化为寻找n-1的最大公约数。最后剩下的数等于起始数m模n的结果。

    代码实现

    class Solution:    def LastRemainingNumber(self, m, n):        if n == 1:            return 0        total = m        last = total % n        return last

    jz47 求前n项和

    问题描述

    要求计算1+2+3+...+n的和,且不能使用乘除法、循环、条件判断等结构。

    思路分析

    使用递归的方法,每次计算n-1的和加上n即可得到结果。

    代码实现

    class Solution:    def Sum_Solution(self, n):        if n == 1:            return 1        return self.Sum_Solution(n - 1) + n

    jz48 不用加减乘除做加法

    问题描述

    两个整数之和,不能使用+、-、*、/运算符。

    思路分析

    利用位运算和进位的方法,逐位计算两个数的和。

    代码实现

    class Solution:    def Add(self, num1, num2):        result = []        carry = 0        while num1 > 0 or num2 > 0 or carry > 0:            sum_bit = num1 % 2 + num2 % 2 + carry            carry = sum_bit // 2            result.append(sum_bit % 2)            num1 //= 2            num2 //= 2        return result

    jz49 把字符串转换成整数

    问题描述

    将字符串转换为整数,不能使用字符串转整数的库函数。非法字符或非法数值返回0。

    思路分析

    首先检查字符串是否为空或包含非法字符。然后遍历每个字符,检查是否为数字字符。最后,将字符串转换为整数。

    代码实现

    class Solution:    def StrToInt(self, s):        if s in ['-', '+', '-', '+']:            return 0        has_invalid = False        for c in s:            if c not in '0123456789+-':                has_invalid = True                break        for c in s:            if c not in '0123456789':                has_invalid = True                break        if has_invalid:            return 0        return int(s) if s else 0

    jz50 数组中重复的数字

    问题描述

    数组中所有数字在0到n-1范围内。找出任意一个重复的数字。

    思路分析

    由于数组长度为n,数字范围为0到n-1,至少有一个数字重复。遍历数组,检查每个数字是否与前一个数字相同。

    代码实现

    class Solution:    def duplicate(self, numbers, duplication):        if not numbers:            return False        for i in range(len(numbers) - 1):            if numbers[i] == numbers[i + 1]:                duplication[0] = numbers[i]                return True        return False

    转载地址:http://trrh.baihongyu.com/

    你可能感兴趣的文章
    python在心理学研究中的应用有哪些_心理学在线研究可用平台简介和应用进展
    查看>>
    python系列【仅供参考】:python tornado 集成redis消息订阅的异步任务之后tornado主程序无法启动,解决方案
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    Python和RF编写web自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>