43、和为S的连续正数序列
*初始化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 here
if tsum < 3:
return []
small = 1
big = 2
#由于序列至少要两个数字,则一直增加small到(1+tsum)/2
middle = (tsum + 1)>>1
curSum = small + big
output = []
while small < middle:
if curSum == tsum:
output.append(range(small, big+1))
big += 1
curSum += big
elif curSum > tsum:
curSum -= small
small += 1
else:
big += 1
curSum += big
return 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 here
if array is None:
return []
res = []
s = 0
e= len(array)-1
while s < e:
if array[s]+array[e]==tsum :
res.append((array[s], array[e]))
s+=1
e-=1
elif array[s]+array[e]< tsum:
s+=1
else:
e-=1
return res
但以上这种方式输出为元组,所以不能AC.
# -*- coding:utf-8 -*-
class Solution:
def FindNumbersWithSum(self, array, tsum):
# write code here
ls = []
if not isinstance(array, list):
return ls
for 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、翻转单词顺序列
【思路】第一步翻转句子中所有的字符,第二步再翻转每个单词中的字符的顺序。遇到空格跳过。
# -*- coding:utf-8 -*-
class Solution:
def ReverseSentence(self, s):
# write code here
ls =s.split(' ')
return ' '.join(ls[::-1])
# -*- coding:utf-8 -*-
class Solution:
def ReverseSentence(self, s):
# write code here
r = 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 s
start = 0
end = length - 1
while start < end:
s[start], s[end] = s[end], s[start]
start += 1
end -= 1
#print 'after', s
return ''.join(s)
def LeftRotateString(self, s, n):
# write code here
if not s:
return ""
length = len(s)
if length <= 0:
return ""
if n > length:
n = n % length
s = 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 here
if len(numbers)==0:
return False
ls=[i for i in numbers if i>0]
ls.sort()
n=0
for i in range(len(ls)-1):
if(ls[i+1]>ls[i]):
n+=ls[i+1]-ls[i]
else: #保证没有对子或者非0的重复数字出现
return False
if n<=4:
return True
else:
return False
48、孩子们的游戏(圆圈中最后剩下的数)
【思路】
递推公式:
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 here
if n<1 or m<1:
return -1
if n ==1:
return 0
last=0
for x in range(2,n+1):
last = (last+m)%x
return last
部分源码来自牛客网。