算法营day18--bilibili笔试题

复数乘法

输入两个表示复数的字符串,输出它们相乘的结果的字符串
复数字符串用a+bi表示(a, b 为整数, i为虚数单位,i2=1)

输入描述:

两个表示复数的字符串

输出描述:

两个数相乘的结果的字符串

思路:
模拟复数相乘的运算。用字符串分别读入两个表达式,用substr函数切割,分别提取出来实数部分和复数部分你,然后模拟运算。
代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main(){
    
    
    string str1;
    string str2;
    while (cin >> str1 >> str2){
    
    
      //截取整数部分
      string s1First = str1.substr(0,str1.find('+'));
      string s2First = str2.substr(0,str2.find('+'));
      int s1f = stoi(s1First);
      int s2f = stoi(s2First);
      //截取复数部分
      string s1Second =str1.substr(str1.find('+')+1);
      string s2Second =str2.substr(str2.find('+')+1);
      int s1s = stoi(s1Second);
      int s2s = stoi(s2Second);
      int real = s1f *s2f - s1s * s2s;
      int comp = s1f *s2s  + s1s * s2f;
      cout<<real<<"+"<<comp<<"i"<<endl;
    }
    return 0;
}

一年中的第几天

输入一个"YYYY-MM-dd"格式的日期字符串,输出该天是当年的第几天(1 月 1 日是每年的第 1 天)

输入描述:

一个"YYYY-MM-dd"格式的表示日期的字符串

输出描述:

该天是当年的第几天

输入例子1:

2019-01-09

输出例子1:

9

输入例子2:

2004-03-01

输出例子2:

61

例子说明2:

2004年为闰年,所以是第31+29+1=61天

思路:
见注释
代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main(){
    
    
    string s;
    while (cin>> s){
    
    
        //用一个数组记录一年当中,当前月累加的天数
        static int days[13]={
    
    0,31,59,90,120,151,181,212,243,273,304,334,365};
        vector<string>vec;
        string temp;
        //用substr分割字符串,将年份、月份、天数都存到一个vector中
        for (int i = 0; i < 2; ++i) {
    
    
            temp = s.substr(0,s.find('-'));
            vec.push_back(temp);
            temp.clear();
            s= s.substr(s.find('-')+1);
        }
        vec.push_back(s);
        //将对应的字符串转成整数,做运算
        int year = stoi(vec[0]);
        int month = stoi(vec[1]);
        int day = stoi(vec[2]);
        int ret = days[month-1] + day;
        if(((year%4 == 0 && year%100 != 0) || year % 400 == 0) && month > 2){
    
    
            ++ret;
        }
        cout<<ret<<endl;
     }
    return 0;
}

k个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

输入描述:

第一行:依次输入链表中的各个元素,以"#"结束

第二行:每组数量k

输出描述:

处理后的链表中的各个元素,以"->"连接

输入例子1:

1 2 3 4 5 #
2

输出例子1:

2->1->4->3->5

输入例子2:

1 2 3 4 5 #
3

输出例子2:

3->2->1->4->5

思路:
见注释
代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void reverseK(vector<string>& vecStr, int start,int end){
    
    
    while (start < end){
    
    
        vecStr[start].swap(vecStr[end]);
        start++;
        --end;
    }
}
int main(){
    
    
    string str;
    vector<string> vecStr;
    //将字符读出来,放到字符数组中去
    while (cin >> str){
    
    
        if(str != "#"){
    
    
            vecStr.push_back(str);
        }
        else{
    
    
            break;
        }
    }
    int k;
    cin >> k;
    int start = 0;
    //判断后面的是否能够凑够k个
    while (start+k-1 < vecStr.size()) {
    
    
        reverseK(vecStr,start,start+k-1);
        start += k;
    }
    //这里输出的时候,要注意不要采坑
    for (int i = 0; i < vecStr.size()-1; ++i) {
    
    
        cout<<vecStr[i]<<"->";
    }
    cout<<vecStr.back()<<endl;
}

猜你喜欢

转载自blog.csdn.net/qq_35353824/article/details/107883332