博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer(41-45)编程题
阅读量:5138 次
发布时间:2019-06-13

本文共 3712 字,大约阅读时间需要 12 分钟。

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 #include 
2 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; }};

 

转载于:https://www.cnblogs.com/wxquare/p/6666429.html

你可能感兴趣的文章
错误:java.util.Map is an interface, and JAXB can't handle interfaces.
查看>>
获取某个表的各种字段,数据类型,字段名,注释等
查看>>
UML类图几种关系的总结
查看>>
动态生成静态文本框
查看>>
用脚本一次update多个字段
查看>>
设计模式(一)
查看>>
MySQL逗号分割字段的行列转换技巧
查看>>
Maven学习笔记
查看>>
[工具分享]wingide 6 算号代码keygen
查看>>
推荐rpm软件包搜索站点https://pkgs.org
查看>>
String类中常用的操作
查看>>
git常用方法
查看>>
康托展开 + 逆展开
查看>>
IP雷达4.0+网络检测
查看>>
2013 Multi-University Training Contest 1 3-idiots
查看>>
自定义dialog
查看>>
[转载] Mac下使用iTerm2让SSH免密码登录远程服务器
查看>>
配置全局的导航栏样式(微信开发)
查看>>
python爬虫Day2:selenium基本使用
查看>>
Tomcat几种出错方法
查看>>