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

本文共 4315 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    node安装卸载linux,Linux运维知识之linux 卸载安装node npm
    查看>>
    node安装及配置之windows版
    查看>>
    Node实现小爬虫
    查看>>
    Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
    查看>>
    Node提示:npm does not support Node.js v12.16.3
    查看>>
    Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件
    查看>>
    Node服务在断开SSH后停止运行解决方案(创建守护进程)
    查看>>
    node模块化
    查看>>
    node模块的本质
    查看>>
    node环境下使用import引入外部文件出错
    查看>>
    node环境:Error listen EADDRINUSE :::3000
    查看>>
    Node的Web应用框架Express的简介与搭建HelloWorld
    查看>>
    Node第一天
    查看>>
    node编译程序内存溢出
    查看>>
    Node读取并输出txt文件内容
    查看>>
    node防xss攻击插件
    查看>>
    noi 1996 登山
    查看>>
    noi 7827 质数的和与积
    查看>>
    NOI-1.3-11-计算浮点数相除的余数
    查看>>
    noi.ac #36 模拟
    查看>>