携程实习笔试3-4

第一题,给算式求值,算式有三种,(+ a b c)返回a+b+c的值,(- a b c d)返回a-b-c-d的值,(* a b )返回a * b的值,然后各种嵌套这几个算式。
示例输入
(+ 3 4)
(- 9 4 5)
(- (* 4 5) 4 5)
(* (+ 2 3)(- 100 (+ 20 10)))
输出
7
0
11
350
写了半天把自己绕晕了,结束后改出来一个版本,也没法测试了,样例倒是过了。
#include<iostream>
#include<string>
#include<stack>
using namespace std;

int main()
{
    string ss;
    while (getline(cin, ss)){
        int n = ss.size();
        stack<char> stac;
        stack<int> num;
        for (int i = 0; i < n; ++i){
            char c = ss[i];
            if (c == ' ') continue;
			else if (c == '(') num.push(-1);
            else if (c == '+' || c == '-' || c == '*') stac.push(c);
            else if (c == ')'){
                if (stac.top() == '+'){
					int tmp = 0;
                    while (num.top() != -1){
                        tmp += num.top();
                        num.pop();
                    }
					num.pop();
                    num.push(tmp);
                }
                else if (stac.top() == '-'){
                    int tmp = 0;
					int pre;
                    while (num.top() != -1){
                        tmp += num.top();
						pre = num.top();
                        num.pop();
                    }
					num.pop();
                    num.push(2*pre-tmp);
                }
                else{
                    int tmp = 1;
                    while (num.top() != -1){
                        tmp *= num.top();
                        num.pop();
                    }
					num.pop();
                    num.push(tmp);
                }
                stac.pop();
            }
            else if ( ss[i]>='0' && ss[i]<='9'){
                int tmp = 0;
                while (i < n && ss[i]>='0' && ss[i]<='9'){
                    tmp = (ss[i]-'0') + tmp*10;
               		i++;
                }
				--i;
                num.push(tmp);
            }
        }
        cout << num.top() << endl;
    }
    return 0;
    
}
第二题发红包,给一个序列的红包,请你分割成n+1份(每份要连续),使得其中钱最少的那一份尽可能多。
例题序列为[1,2,3,4,5,6,7,8,9],分割成6份,答案是6。
[1,2,3],[4,5],[6],[7],[8],[9]
我赶脚就是二分这个结果,贪心看看按照这个结果能不能分出n+1份及以上,不能就右边界往左,能就左边界往右,然而0%...
        int m = packets.size();
        int right = 0;
    for (int i = 0; i < m; ++i) right += packets[i];
    int left = 0;
    while (left < right){
        int mid = left + (right - left) / 2;
        int cnt = 0;
        int sum = 0;
        for (int i = 0; i < m; ++i){
            sum += packets[i];
            if (sum >= mid){
                cnt++;
                sum = 0;
            }
        }
        if (cnt >= n+1) left = mid;
        else right = mid - 1;
    }        
        return left;
有大佬可以帮忙看看吗

#携程##笔试题目#
全部评论
请问你是技术岗的吗,面试一共几题呀?
点赞 回复 分享
发布于 2022-03-14 18:54

相关推荐

03-15 00:45
已编辑
中国科学院大学 Java
问的很简单都秒了,但是面试官没开摄像头,疑似kpi,无后续。--------------------3/14更新,3/12通知给了口头offer,3/13发了意向书,已拒。一面(35min)(25/3/6)(无后续)&nbsp;&nbsp;&nbsp;&nbsp;1、自我介绍&nbsp;&nbsp;&nbsp;&nbsp;2、介绍一下你的那个Python相关项目(本科毕设,web系统+算法模型提供部分接口)&nbsp;&nbsp;&nbsp;&nbsp;3、Java面向对象有哪些特点呢?详细说一下。&nbsp;&nbsp;&nbsp;&nbsp;4、介绍一下hashmap;为什么要把链表转换为红黑树呢?红黑树查找的时间复杂度?1.7和1.8的区别。&nbsp;&nbsp;&nbsp;&nbsp;5、介绍一下concurrentHashmap。&nbsp;&nbsp;&nbsp;&nbsp;6、synchronized锁和Lock锁有什么区别?&nbsp;&nbsp;&nbsp;&nbsp;7、公平锁的一个底层是怎么实现的呢?&nbsp;&nbsp;&nbsp;&nbsp;8、线程池的核心参数、拒绝策略、提交一个任务执行流程?&nbsp;&nbsp;&nbsp;&nbsp;9、spring有哪些特点?(ioc/aop)&nbsp;&nbsp;&nbsp;&nbsp;10、spring中对于循环依赖是怎么解决的?&nbsp;&nbsp;&nbsp;&nbsp;11、MySQL和redis的区别?&nbsp;&nbsp;&nbsp;&nbsp;12、MySQL的索引结构是什么?&nbsp;&nbsp;&nbsp;&nbsp;13、MySQL的事务有哪些特性?怎么保证?&nbsp;&nbsp;&nbsp;&nbsp;14、MySQL的默认隔离级别?可重复读是怎么做到的呢?&nbsp;&nbsp;&nbsp;&nbsp;15、介绍一下MVCC和快照读readview。&nbsp;&nbsp;&nbsp;&nbsp;16、一般在什么场景下会使用redis?&nbsp;&nbsp;&nbsp;&nbsp;17、对于大量的请求,如果此时缓存中还没有写入数据怎么办?&nbsp;&nbsp;&nbsp;&nbsp;18、介绍一下redis实现的分布式锁。&nbsp;&nbsp;&nbsp;&nbsp;19、有用过es和mongo&nbsp;DB吗?(知道,没用过)&nbsp;&nbsp;&nbsp;&nbsp;20、消息中间件用过吗?说一下你的使用场景?&nbsp;&nbsp;&nbsp;&nbsp;21、一个场景,如果说有一个接口响应的比较慢,如果说让你排查,你会怎么去排查?(上下游接口、大key问题,只答了两,后面试官补充)&nbsp;&nbsp;&nbsp;&nbsp;无手撕,反问业务。
胖墩墩的查理在学c语言:哥们我是五号面的 流程差不多
查看21道真题和解析
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客企业服务