• 剑指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;
        }
    };
  • 相关阅读:
    H5版俄罗斯方块(5)---需求演进和产品迭代
    vim 常用 NERDTree 快捷键
    C和C++中include 搜索路径的一般形式以及gcc搜索头文件的路径
    MySQL复制协议
    深入解析MySQL replication协议
    Install CodeBlocks in CentOS 7
    Impala 源码分析-FE
    Elasticsearch 6.x 的分页查询数据
    1、树莓派3B开箱+安装系统
    Python创建ES索引
  • 原文地址:https://www.cnblogs.com/wxquare/p/6666429.html
Copyright © 2020-2023  润新知