41、入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
1 class Solution { 2 public: 3 vector FindNumbersWithSum(vector array,int sum) { 4 int n = array.size(); 5 int left = 0; 6 int right = n-1; 7 while(left < right){ 8 if(array[left] + array[right] < sum){ 9 left++;10 }else if(array[left] + array[right] > sum){11 right--;12 }else{13 break;14 }15 }16 vector res;17 if(left < right){18 res.push_back(array[left]);19 res.push_back(array[right]);20 }21 return res;22 }23 };
42、小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck
1 #include2 using namespace std; 3 4 class Solution { 5 public: 6 vector > FindContinuousSequence(int sum) { 7 vector > res; 8 if (sum < 3) return res; 9 int mid = (sum + 1) >> 1;10 11 int small = 1;12 int big = 2;13 int curSum = 3;14 while (small < mid) {15 if (curSum == sum) {16 vector seq;17 for (int i = small; i <= big; i++) {18 seq.push_back(i);19 }20 res.push_back(seq);21 curSum -= small;22 small++;23 } else if (curSum < sum) {24 big++;25 curSum += big;26 } else if (curSum> sum) {27 curSum -= small;28 small++;29 }30 }31 return res;32 }33 };
43.汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
class Solution {public: string LeftRotateString(string str, int n) { int len = str.length(); if(len == 0) return str; n = n % len; return str.substr(n) + str.substr(0,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 < 2) return str; int left = 0,right = n-1; while(left < right){ swap(str[left++],str[right--]); } int start = 0; for (int i = 0; i < n; i++) { if (str[i] == ' ') { left = start; right = i - 1; while (left < right) { swap(str[left++],str[right--]); } start = i + 1; } } left = start; right = n -1; 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 numbers) { int n = numbers.size(); if(n != 5) return false; sort(numbers.begin(), numbers.end()); int gap = 0; int count0 = 0; if (numbers[0] == 0) count0++; for (int i = 1; i < n; i++) { if (numbers[i] == 0) count0++; else if (numbers[i] == numbers[i - 1]) return false; else if(numbers[i] - numbers[i-1] > 1 && numbers[i-1] != 0){ gap += numbers[i] - numbers[i - 1] - 1; } } if (gap > count0) return false; return true; }};