zoukankan      html  css  js  c++  java
  • cisco笔试记录

    输入一个字符串,转换为特定的格式,如:2019, 12, 31, 23, 59, 59, 1表示在2019-12-31 23:59:59的1s后时间,即:2020-01-01 00:00:00

    咋一看很简单,但还是发现自己的代码基础还需要很大提升,我至少写了2个半小时,最大的收获感觉就是不管遇到简单还是复杂的题,一定要先把思路先写清楚,越细节越好,不然写好之后也很难调试。

    思路:

    1. 首先从进位的角度考虑,时分秒的进位都是固定的:24,60,60,可以先用一个循环把秒进位转换成日进位。
    2. 由于每个月的日期数不同,因此可能是:逢31进1,逢30进一,以及2月的闰年逢29进一与普通年份的逢28进一。
    3. 以月为周期,每个周期的日期数都不相同,因此用while循环一个月一个月地消减日期数.
       1 #include<iostream>
       2 #include<string>
       3 #include<vector>
       4 #include<algorithm>
       5 using namespace std;
       6 
       7 // 时分秒进位
       8 vector<int> fulpre(int fp, int ndata, int fdata) {
       9     vector<int> res;
      10     res.push_back((fdata + ndata) / fp);    
      11     res.push_back((fdata + ndata) % fp);
      12     return res;
      13 }
      14 
      15 // 按月进位
      16 bool modymd(vector<int>& arr, int zq, int& date) {
      17     int alen = arr.size() - 1;
      18     if ((date + arr[2]) / (zq+1) > 0) {  
      19         date =date- (zq - arr[2])-1;
      20         if (arr[1] == 12) {
      21             arr[0]++;arr[1] = 1;
      22         }
      23         else {
      24             arr[1] = arr[1] + 1;
      25         }
      26         if (date >= 0) { arr[2] = 1; }
      27         return true;
      28     }
      29     else {
      30         arr[2] = date + arr[2];
      31         return false;
      32     }
      33 }
      34 
      35 string getTime(vector<int>& arr) {
      36     int alen = arr.size() - 1;
      37     int afsec = arr[alen];
      38     // 时分秒进位
      39     vector<int> unit = { 60,60,24 }, tmp = { afsec,0 };
      40     for (int i = 0; i < 3; ++i) {
      41         tmp = fulpre(unit[i], arr[5 - i], tmp[0]);
      42         arr[5 - i] = tmp[1];
      43     }
      44     // 年月日进位
      45     int date = tmp[0];
      46     vector<int> tod = { 1,3,5,7,8,10,12 }, tzd = { 4,6,9,11 }, tsed = { 2 };
      47     while (date > 0) {
      48         vector<int>::iterator it;
      49         bool flag = false,tg=false;
      50         if (count(tod.begin(), tod.end(), arr[1]) > 0) flag = modymd(arr, 31, date);
      51         else if (count(tzd.begin(), tzd.end(), arr[1]) > 0) flag = modymd(arr, 30, date);
      52         else {       // 对于二月分,要考虑闰年
      53             if ((arr[0] % 4 == 0 && arr[0] % 100 != 0) || arr[0] % 400 == 0) {
      54                 flag = modymd(arr, 29, date);
      55             }
      56             else flag = modymd(arr, 28, date);
      57         }
      58         if (!flag){
      59             break;
      60         }
      61     }
      62     // 将结果打包成字符串
      63     string s;
      64     string cs[6] = { "-","-"," ",":",":",""};
      65     for (int i = 0; i < alen; ++i) {
      66         if(arr[i]<10) s.append(to_string(0));   // 小于10的数字,需要首先填充0
      67         s.append(to_string(arr[i])+cs[i]);
      68     }
      69     return s;
      70 }
      71 
      72 int main() {
      73     vector<int> arr;
      74     int tmp;
      75     /*do{
      76         if (cin.get() != ',') {
      77             cin >> tmp;
      78             arr.push_back(tmp);
      79         }
      80     } while (cin.get() != '
      ');*/
      81     do {
      82             cin >> tmp;
      83             arr.push_back(tmp);
      84     } while (cin.get() != '
      '); 
      85     cout << getTime(arr);
      86     return 0;
      87 }

      另外还要注意字符串的追加、向量输入(其实这里也可以用getline() 然后分割字符串):这里由于tmp是int,好像自动忽略了','。

    心之所愿,永不相忘
  • 相关阅读:
    linux 共享内存 信号量 同步
    进程间通信 共享内存
    linux 多进程绑定问题
    C 语言调用python 脚本函数
    C 语言 和 python 调用 .so 文件
    好好学习
    three.js
    AMD、CMD、UMD 模块的写法
    webpack查缺补漏
    什么是 Web 服务器(server)
  • 原文地址:https://www.cnblogs.com/zgll/p/15302876.html
Copyright © 2011-2022 走看看