剑指offer66题(Python)——第八天

2024-06-23 23:08
文章标签 python 第八天 offer66

本文主要是介绍剑指offer66题(Python)——第八天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

43、和为S的连续正数序列

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
【思路】
*初始化small=1,big=2;
*small到big序列和小于sum,big++;大于sum,small++;
*当small增加到(1+sum)/2是停止
# -*- coding:utf-8 -*-
class Solution:def FindContinuousSequence(self, tsum):# write code hereif tsum < 3:return []small = 1big = 2#由于序列至少要两个数字,则一直增加small到(1+tsum)/2middle = (tsum + 1)>>1curSum = small + bigoutput = []while small < middle:if curSum == tsum:output.append(range(small, big+1))big += 1curSum += bigelif curSum > tsum:curSum -= smallsmall += 1else:big += 1curSum += bigreturn output


44、和为S的两个数字

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。例如列表data的值为[1, 3, 4, 5, 8, 9, 11],找出这个列表中和为13的两个数字的所有组合。4+9=13, 5+8=13。

【思路】采用首尾相加法

# -*- coding:utf-8 -*-
class Solution:def FindNumbersWithSum(self, array, tsum):# write code hereif array is None:return []res = []s = 0e= len(array)-1while s < e:if array[s]+array[e]==tsum :res.append((array[s], array[e]))s+=1e-=1elif array[s]+array[e]< tsum:s+=1else:e-=1return res

但以上这种方式输出为元组,所以不能AC.

# -*- coding:utf-8 -*-
class Solution:def FindNumbersWithSum(self, array, tsum):# write code herels = []if not isinstance(array, list):return lsfor i, v in enumerate(array):for v1 in array[i:]:if (v + v1) == tsum:ls.append([v, v1])if ls:return ls[0]else:return ls


45、翻转单词顺序列

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

【思路】第一步翻转句子中所有的字符,第二步再翻转每个单词中的字符的顺序。遇到空格跳过。

# -*- coding:utf-8 -*-
class Solution:def ReverseSentence(self, s):# write code herels =s.split(' ')return ' '.join(ls[::-1])
# -*- coding:utf-8 -*-
class Solution:def ReverseSentence(self, s):# write code herer = s.split(' ')r.reverse()return ' '.join(r)
class Solution {
public:string ReverseSentence(string str) {auto size = str.size();if(size == 0) return "";int mark=0;str += ' ';for(int i = 0; i < size+1; ++i){if(str[i] == ' '){ReverseWord(str, mark, i-1);mark = i+1;}}str = str.substr(0, size);ReverseWord(str, 0, size-1);return str;}void ReverseWord (string &str, int l, int r){while(l < r){swap(str[l], str[r]);++l;--r;}}
};

46、左旋转字符串

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。

【思路】

假设字符串abcdef,n=3,设X=abc,Y=def,所以字符串可以表示成XY,如题干,问如何求得YX。
假设X的翻转为X^T,X^T=cba,同理Y^T=fed,那么YX=(X^TY^T)^T,三次翻转后可得结果。
# -*- coding:utf-8 -*-
class Solution: def reverse(self, s):if not s:return ""length = len(s)if length <= 0:return ""s = list(s)#print sstart = 0end = length - 1while start < end:s[start], s[end] = s[end], s[start]start += 1end -= 1#print 'after', sreturn ''.join(s)def LeftRotateString(self, s, n):# write code hereif not s:return ""length = len(s)if length <= 0:return ""if n > length:n = n % lengths = self.reverse(s)first = ""second = ""for i in range(length - n):first += s[i]first = self.reverse(first)for i in range(length - n, length, 1):second += s[i]second = self.reverse(second)return first + second
class Solution {
public:void fun(string &s,int start,int end){char temp;while(start<end){temp=s[start];s[start]=s[end];s[end]=temp;start++;end--;}}string LeftRotateString(string str, int n) {int len=str.length();if(0==len || 0==n)return str;string &temp=str;fun(temp,0,n-1);fun(temp,n,len-1);fun(temp,0,len-1);return str;}
};

47、扑克牌顺子

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的运气如何。为了方便起见,你可以认为大小王是0。

【思路】    max 记录 最大值

                min 记录  最小值
                min ,max 都不记0
                满足条件 1 max - min <5
                               2  除0外没有重复的数字(牌)
                               3 数组长度 为5
# -*- coding:utf-8 -*-
class Solution:def IsContinuous(self, numbers):# write code hereif len(numbers)==0:return Falsels=[i for i in numbers if i>0]ls.sort()n=0for i in range(len(ls)-1):if(ls[i+1]>ls[i]):n+=ls[i+1]-ls[i]else:  #保证没有对子或者非0的重复数字出现return Falseif n<=4:return Trueelse:return False

48、孩子们的游戏(圆圈中最后剩下的数)

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1).

【思路】

递推公式:

    f[1]=0;  i=1

    f[i]=(f[i-1]+m)%i;  (i>1)

# -*- coding:utf-8 -*-
class Solution:def LastRemaining_Solution(self, n, m):# write code hereif n<1 or m<1:return -1if n ==1:return 0last=0for x in range(2,n+1):last = (last+m)%xreturn last

部分源码来自牛客网。


这篇关于剑指offer66题(Python)——第八天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088536

相关文章

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

python 喷泉码

因为要完成毕业设计,毕业设计做的是数据分发与传输的东西。在网络中数据容易丢失,所以我用fountain code做所发送数据包的数据恢复。fountain code属于有限域编码的一部分,有很广泛的应用。 我们日常生活中使用的二维码,就用到foutain code做数据恢复。你遮住二维码的四分之一,用手机的相机也照样能识别。你遮住的四分之一就相当于丢失的数据包。 为了实现并理解foutain

python 点滴学

1 python 里面tuple是无法改变的 tuple = (1,),计算tuple里面只有一个元素,也要加上逗号 2  1 毕业论文改 2 leetcode第一题做出来

Python爬虫-贝壳新房

前言 本文是该专栏的第32篇,后面会持续分享python爬虫干货知识,记得关注。 本文以某房网为例,如下图所示,采集对应城市的新房房源数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly93aC5mYW5nLmtlLmNvbS9sb3VwYW4v 目标:采集对应城市的

python 在pycharm下能导入外面的模块,到terminal下就不能导入

项目结构如下,在ic2ctw.py 中导入util,在pycharm下不报错,但是到terminal下运行报错  File "deal_data/ic2ctw.py", line 3, in <module>     import util 解决方案: 暂时方案:在终端下:export PYTHONPATH=/Users/fujingling/PycharmProjects/PSENe

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as npimport scipy.io as sioimport matplotlib.pyplot as pltimport statistics as statsimport pandas

Python利用qq邮箱发送通知邮件(已封装成model)

因为经常喜欢写一些脚本、爬虫之类的东西,有需要通知的时候,总是苦于没有太好的通知方式,虽然邮件相对于微信、短信来说,接收性差了一些,但毕竟免费,而且支持html直接渲染,所以,折腾了一个可以直接使用的sendemail模块。这里主要应用的是QQ发邮件,微信关注QQ邮箱后,也可以实时的接收到消息,肾好! 好了,废话不多说,直接上代码。 # encoding: utf-8import lo