博客
关于我
牛客网——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/

    你可能感兴趣的文章
    npm设置源地址,npm官方地址
    查看>>
    npm设置镜像如淘宝:http://npm.taobao.org/
    查看>>
    npm配置安装最新淘宝镜像,旧镜像会errror
    查看>>
    NPM酷库052:sax,按流解析XML
    查看>>
    npm错误 gyp错误 vs版本不对 msvs_version不兼容
    查看>>
    npm错误Error: Cannot find module ‘postcss-loader‘
    查看>>
    npm,yarn,cnpm 的区别
    查看>>
    NPOI
    查看>>
    NPOI之Excel——合并单元格、设置样式、输入公式
    查看>>
    NPOI初级教程
    查看>>
    NPOI利用多任务模式分批写入多个Excel
    查看>>
    NPOI在Excel中插入图片
    查看>>
    NPOI将某个程序段耗时插入Excel
    查看>>
    NPOI格式设置
    查看>>
    NPOI设置单元格格式
    查看>>
    Npp删除选中行的Macro录制方式
    查看>>
    NR,NF,FNR
    查看>>
    nrf24l01+arduino
    查看>>
    nrf开发笔记一开发软件
    查看>>
    nrm —— 快速切换 NPM 源 (附带测速功能)
    查看>>