剑指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;
    }
};
原文地址:https://www.cnblogs.com/wxquare/p/6666429.html