网易实习笔试题(2020.04.11)-9进制的加法

网易实习第一题:C++实现9进制加法
考试时候通过率为25%,这是考完试又重新写的,应该通过率为百分百了
注意点:要考虑全面,有可能是两个浮点数相加,也有可能是两个整数相加,还有可能是一个整数一个浮点数相加

基本思想 是分治法:用子函数实现,得到每个数的整数部分和浮点数部分,然后为短的部分补零

#include<iostream>
#include<vector>
#include <string>
#include <stdlib.h>
//#include <string.h>
#include<stack>
#include<queue>
#include<set>
#include <algorithm>
# include <functional>
#include<array>
using namespace std;

class Solution 
{
public:
    //网易实习第一题:C++实现9进制加法
    //考试时候通过率为25%,这是考完试又重新写的,应该通过率为百分百了
    //要考虑全面,有可能是两个浮点数相加,也有可能是两个整数相加,还有可能是一个整数一个浮点数相加
    //基本思想是分治法:用子函数实现,得到每个数的整数部分和浮点数部分,然后为短的部分补零
    bool is_float(string num) //判断是否是浮点数
    {
        bool flag=false;
        if(!num.empty())
        {

            for(int i=0;i<num.size();i++)
            {
                if(num[i]=='.')
                {
                    flag=true;
                }
            }
        }
        return flag;
    }
    stack<int> get_float(string num)//得到小数部位
    {
        int k;
        stack<int> res;
        for(k=0;k<num.size();k++)
        {
            if(num[k]=='.')
            {
                break;
            }
        }
        for(int j=k+1;j<num.size();j++)
        {
            res.push(num[j]-'0');
        }
        return res;
    }
    stack<int> get_int(string num)//得到整数部位
    {
        stack<int> res;
        for(int i=0;i<num.size();i++)
        {
            if(num[i]!='.')
            {
                res.push(num[i]-'0');
            }
            else
            {

                break;
            }

        }
        return res;
    }
    void length_same(stack<int> &s1,stack<int> &s2)//为俩小数位 位数比较短的 补零
    {
        if(s1.size()>s2.size())
        {
            for(int i=s2.size();i<s1.size();i++)
            {
                s2.push(0);
            }
        }
        else
        {
            for(int i=s1.size();i<s2.size();i++)
            {
                s1.push(0);
            }
        }

    }

    string add(string num1,string num2) 
    {
       stack<int> int1;
       stack<int> int2;
       stack<int> float1;
       stack<int> float2;
       int flag = 0;//是否进位的标志位
       int flag_dot=0;//是否有小数参与运算的标志位
       string res;//返回的结果
       int1 = get_int(num1);
       int2 = get_int(num2);
       bool flag1_float;
       bool flag2_float;
       flag1_float = is_float(num1);
       flag2_float = is_float(num2);
       if(flag1_float)
       {
           float1 = get_float(num1);
       }
       if(flag2_float)
       {
           float2 = get_float(num2);
       }
       //length_same(float1,float2);
       if(!float1.empty()||!float2.empty())
       {
           length_same(float1,float2);
       }
       while(!float1.empty()&&!float2.empty())
       {
           flag_dot = 1;
           int a = float1.top();
           float1.pop();
           int b = float2.top();
           float2.pop();
           int temp = a+b+flag;
           if(temp<9)
           {
               res = res+to_string(temp);
               flag = 0;
           }
           else
           {
               temp = a+b+flag-9;
               res = res+to_string(temp);
               flag = 1;
           }

       }
       if(flag_dot==1)
       {
           res = res+'.';
       }
       while(!int1.empty()&&!int2.empty())
       {
           int a = int1.top();
           int1.pop();
           int b = int2.top();
           int2.pop();
           int temp = a+b+flag;
           if(temp<9)
           {
               res = res+to_string(temp);
               flag = 0;
           }
           else
           {
               temp = a+b+flag-9;
               res = res+to_string(temp);
               flag = 1;
           }
       }
       while(!int1.empty())
       {
            int a = int1.top();
            int1.pop();
            int temp = a+flag;
            if(temp<9)
            {
                res = res+to_string(temp);
                flag = 0;
            }
            else
            {
                temp = a+flag-9;
                res = res+to_string(temp);
                flag = 1;
            }
       }
        while(!int2.empty())
        {
            int a = int2.top();
            int2.pop();
            int temp = a+flag;
            if(temp<9)
            {
                res = res+to_string(temp);
                flag = 0;
            }
            else
            {
                temp = a+flag-9;
                res = res+to_string(temp);
                flag = 1;
            }
        }
        if(flag==1)
        {
            res = res+to_string(1);
        }
        reverse(res.begin(),res.end());
        return res;




    }
};

int main()
{
    Solution s;
    string result;
    result = s.add("1.1","15.86");
    cout<<result<<endl;
    return 0;
}

测试用例:1.1+15.86
测试结果:
测试用例结果

全部评论

相关推荐

10-17 23:18
已编辑
西北农林科技大学 Web前端
独行m:给25可以试试,但他只能给12,那就是纯纯的事精
秋招,不懂就问
点赞 评论 收藏
分享
10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务