剑指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;
    }
};
时间: 2024-10-18 22:22:21

剑指offer(41-45)编程题的相关文章

剑指offer (41) 有序数组数字之和

题目:输入一个递增排序的数组和一个数字target,在数组中查找两个数使得它们的和正好是target 题解分析: 一提到有序数组,应该立马联想到 二分查找 因为数组已经有序了,我们可以设置两个游标first和last,下标first指向 0, last指向 size() - 1, 然后相加 如果 相加和 大于 target,last-- 如果 相加和 小于 target,first++ T(n) = O(n) void TwoSum(const std::vector<int>& nu

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the s

【剑指offer】第四题 替换空格

/** * 剑指offer 第4题 替换空格 * 特点:1.先扫描串中的空格数,计算好替换后的长度 * 2.使用双指针,从后面开始向前替换,避免从前开始每次替换后就要移动后面的所有的数据 * 测试用例:特殊:有多个空格 * 错误:数组长度不够,字符串为空 * */ package javaTrain; public class Offer4 { public static void main(String[] args) { String a = "Hello I am Daisy Dong!&

剑指offer第十八题 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 解题思路:一次去掉一个外圈,当最后只剩一行或一列时停止递归.(ps:这题就是绕,仔细点就解决了!!!) 1 import java.util.ArrayList; 2 public class Solution { 3 publ

《剑指offer》第十七题:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <cstdio> #include <memory> void PrintNumber(char* number); bool Increment(char* number); void Print1ToMaxOfNDigitsRecursively(char* number, int length

《剑指offer》之7-9题

7.斐波那契数列 问题描述 都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. 实现思想 了解斐波那契数列的规律就Ok了.1,1,2,3,5,8,... 代码 function Fibonacci(n) { // write code here if(n==0||n==1){ return n; } var N1=1,N2=0; for(let i=2;i<=n;i++){ N1=N1+N2; N2=N1-N2; } return N1; } 8.跳台阶 问题描述 一只青

【剑指offer】 第三题 二维数组查找

package javaTrain; public class offer3 { public static void main(String args[]) { int[][] a = {{0,1,2,3},{1,2,3,4},{2,3,4,5},{6,7,8,9}}; System.out.println(find(a,10)); } public static boolean find(int[][] a,int num) { if(a == null) return false; int

【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列

#include<iostream> #include<stack> using namespace std; template <typename T> void pushQueue(stack<T> &stack1, T t){ stack1.push(t); } template<typename T> T popQueue(stack<T> &stack1, stack<T> &stack2

【校招面试 之 剑指offer】第9-2题 用两个队列实现一个栈

#include<iostream> #include<queue> using namespace std; // 对于出栈解决的思路是:将queue1的元素除了最后一个外全部放到queue2中,然后再pop出queue1的最后一个元素... template<typename T> void popStack(queue<T> &queue1, queue<T> &queue2){ if(queue1.size() == 0)

【校招面试 之 剑指offer】第10-3题 矩阵覆盖问题

题目:我们可以使用2??1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个2??1的小矩形无重叠地覆盖一个2??8的大矩形,共有多少种方法? 分析:当放第一块时(假定从左边开始)可以横着放,也可以竖着放,记总的情况为f(8).如果是竖着放,则记下来还有f(7)种放法:若是横着放,则下一块必须横着放,则还有f(6)种放法. 所以可以推导出公式:f(1) = 1 f(2) = 2 f(n)(n为偶数) = f(n-1)+f(n-2); #include<iostream> #include<