zoukankan      html  css  js  c++  java
  • 面试题41 和为S的连续正数序列

    题目描述

    小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 
    输出描述:
    输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

     1 class Solution {
     2 public:
     3     vector<vector<int> > v;
     4     vector<int> vc;
     5 
     6     vector<vector<int> > FindContinuousSequence(int sum) {
     7         if (sum <= 1)
     8             return v;
     9         int csum = 0, i = 0;
    10         while (i <= sum / 2 + 2) {
    11             vector<int>::iterator iter = vc.begin();
    12             if (csum > sum) {
    13                 csum -= vc[0];
    14                 vc.erase(iter);
    15             }
    16             else if (csum == sum) {
    17                 if (vc.size() > 1){
    18                     v.push_back(vc);
    19                 }
    20                 i++;
    21                 csum += i;
    22                 vc.push_back(i);
    23             }
    24             else {
    25                 i++;
    26                 csum += i;
    27                 vc.push_back(i);
    28             }
    29         }
    30         return v;
    31     }
    32 };

    题目描述

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 
    输出描述:
    对应每个测试案例,输出两个数,小的先输出。
     1 class Solution {
     2 public:
     3     vector<int> v;
     4     vector<int> FindNumbersWithSum(vector<int> array,int sum) {
     5         if (array.size() <= 1)
     6             return v;
     7         int i = 0, j = array.size() - 1;
     8         while (i < j){
     9             if (array[i] + array[j] == sum){
    10                 if (v.size() == 0){
    11                     v.push_back(array[i]);
    12                     v.push_back(array[j]);
    13                 }
    14                 else{
    15                     if (v[0] * v[1] > array[i] * array[j]){
    16                         v[0] = array[i];
    17                         v[1] = array[j];
    18                     }
    19                 }
    20                 i++;
    21             }
    22             else if (array[i] + array[j] < sum)
    23                 i++;
    24             else
    25                 j--;
    26         }
    27         return v;
    28     }
    29 };
  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/wanderingzj/p/5359087.html
Copyright © 2011-2022 走看看