41、入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int n = array.size();
int left = ;
int right = n-;
while(left < right){
if(array[left] + array[right] < sum){
left++;
}else if(array[left] + array[right] > sum){
right--;
}else{
break;
}
}
vector<int> res;
if(left < right){
res.push_back(array[left]);
res.push_back(array[right]);
}
return res;
}
};
42、小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck
#include <vector>
using namespace std; class Solution {
public:
vector<vector<int>> FindContinuousSequence(int sum) {
vector<vector<int>> res;
if (sum < ) return res;
int mid = (sum + ) >> ; int small = ;
int big = ;
int curSum = ;
while (small < mid) {
if (curSum == sum) {
vector<int> seq;
for (int i = small; i <= big; i++) {
seq.push_back(i);
}
res.push_back(seq);
curSum -= small;
small++;
} else if (curSum < sum) {
big++;
curSum += big;
} else if (curSum> sum) {
curSum -= small;
small++;
}
}
return res;
}
};
43.汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
class Solution {
public:
string LeftRotateString(string str, int n) {
int len = str.length();
if(len == ) return str;
n = n % len;
return str.substr(n) + str.substr(,n);
}
};
44.牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
class Solution {
public:
string ReverseSentence(string str) {
int n = str.length();
if (n < ) return str; int left = ,right = n-;
while(left < right){
swap(str[left++],str[right--]);
} int start = ;
for (int i = ; i < n; i++) {
if (str[i] == ' ') {
left = start;
right = i - ;
while (left < right) {
swap(str[left++],str[right--]);
}
start = i + ;
}
} left = start;
right = n -;
while(left < right){
swap(str[left++],str[right--]);
} return str;
}
};
45.从扑克牌中随机抽5张,判断是不是一个顺子。2-10为数字本身,A代表1,j、Q、K分别代表11,12,13,大小王用0表示,可以看做任何的数字。
class Solution {
public:
bool IsContinuous(vector<int> numbers) {
int n = numbers.size();
if(n != ) return false;
sort(numbers.begin(), numbers.end());
int gap = ;
int count0 = ;
if (numbers[] == ) count0++;
for (int i = ; i < n; i++) {
if (numbers[i] == )
count0++;
else if (numbers[i] == numbers[i - ])
return false;
else if(numbers[i] - numbers[i-] > && numbers[i-] != ){
gap += numbers[i] - numbers[i - ] - ;
}
} if (gap > count0) return false;
return true;
}
};