剑指offer(41-45)编程题
41、入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
1 class Solution { 2 public: 3 vector<int> FindNumbersWithSum(vector<int> 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<int> 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 #include <vector> 2 using namespace std; 3 4 class Solution { 5 public: 6 vector<vector<int>> FindContinuousSequence(int sum) { 7 vector<vector<int>> 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<int> 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<int> 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; } };