百度软件开发笔试大题3

对表达式求值。已知运算符只有加减乘除,无负数,结果也不是负数。(类似逆波兰法的算法思路)

思想:对数字只要入栈就可以,需要时拿出来计算。对符号,有几种情况:

(1)新符号加入前符号栈中还没有符号,则直接入栈;

(2)新符号是加减运算,则将之前符号栈中的符号全部拿出来计算,每次消耗1个符号,2个数字,再将得到的结果压入数字栈;

(3)新符号是乘除,之前的符号也是乘除,则只需要消耗一个符号就行;

(4)新符号乘除,原来符号加减,则符号压栈即可。

Eg. 1+4*5+2*3,定义两个栈分别存数字和符号,叫numStack和sigStack。

1)数字"1"入栈numStack;

2)因栈中还没有符号,符号"+"进栈sigStack;

3)数字"4"进栈numStack;

4)"*"属于乘除,而栈顶是加减,所以直接入栈sigStack;

5)5直接进栈numStack;

6)新符号加减运算,意味着之前的运算都可以完成,顺序是:5,4分别出栈,*出栈,4*5=20入栈numStack,然后20,1分别出栈,+出栈,

1+20=21入栈numStack,从而numStack只留下21,sigStack为空,然后"+"入栈sigStack;

7)2入栈numStack;

8)新符号*,栈顶符号+,直接入栈;

9)3入栈。

至此所有元素已经处理完毕,接下来就可以消耗所有的符号了,顺序是:2,3出栈,*出栈,3*2=6入栈,6,21出栈,+出栈,21+6=27得到结果。

下面是Java实现代码:

 1 package preTest;
 2
 3 import java.util.Scanner;
 4 import java.util.Stack;
 5
 6 public class Main3 {
 7     public static Stack sigStack = new Stack();//for char
 8     public static Stack numStack = new Stack();//for int
 9
10     public static void main(String[] args) {
11         Scanner in = new Scanner(System.in);
12         while(in.hasNext()){
13             String str = in.nextLine();
14             int result = cal(str);
15             System.out.println(result);
16         }
17     }
18     public static int cal(String str){
19         sigStack.clear();
20         numStack.clear();
21         StringBuilder sb = new StringBuilder();
22         int len = str.length();
23         int result= 0;
24         //完成数字和符号的压栈
25         for(int i=0; i<len;i++){
26             char c = str.charAt(i);
27             //数字
28             if(c>=‘0‘ && c <=‘9‘){
29                 sb.append(c);
30                 if(i==len-1){
31                     int x = Integer.parseInt((sb.toString()));
32                     numStack.push(x);
33                 }
34             }else{
35                 int x = Integer.parseInt((sb.toString()));
36                 numStack.push(x);
37                 sb.replace(0, sb.length(), "");
38                 if(sigStack.size() == 0){
39                     sigStack.push(c);
40                 }else{
41                     char existed = (char)sigStack.peek();
42                     //如果已经压栈的符号优先级>=当前符号c,则完成压栈符号的操作
43                     if(c==‘+‘ || c==‘-‘){
44                         zhengli();
45                         sigStack.push(c);
46                         //当两个都是乘除运算时
47                     }else if(existed ==‘*‘ || existed == ‘/‘){
48                         tinyAdjust(c);
49                     }else{//新符号乘除,旧符号加减
50                         sigStack.push(c);
51                     }
52                 }
53             }
54         }
55         //计算结果
56         zhengli();
57         result = (int)numStack.pop();
58         return result;
59     }
60
61     //简单加减乘除计算
62     public static int compute(int a, int b, char c){
63         int result = 0;
64         switch(c){
65         case ‘+‘: result = a+b;
66             break;
67         case ‘-‘: result = a-b;
68             break;
69         case ‘*‘: result = a*b;
70             break;
71         case ‘/‘: result = a/b;
72             break;
73         }
74         return result;
75     }
76
77     //完全消化已经压栈的符号,用于新符号是加减时
78     public static void zhengli(){
79         while(sigStack.size() > 0){
80             int a = (int)numStack.pop();
81             int b = (int)numStack.pop();
82             char c = (char)sigStack.pop();
83             int x = compute(b,a,c);
84             numStack.push(x);
85         }
86     }
87
88     //消化一个符号,用于连续两个加减乘除符号出现时
89     public static void tinyAdjust(char c){
90         int x1 = (int)numStack.pop();
91         int x2 = (int)numStack.pop();
92         int x3 = compute(x2, x1,(char)sigStack.pop());
93         numStack.push(x3);
94         sigStack.push(c);
95     }
96
97 }
时间: 2024-10-10 07:19:26

百度软件开发笔试大题3的相关文章

2017年腾讯 秋招软件开发笔试编程题回忆版

2017年腾讯秋招软件开发笔试编程题回忆版 (所有题目大致描述如下,并非完整的题目回忆,但意思大致一样) 1.又一个魔法城市,城市里面有n个魔法城堡,序号为0,1,2...n-1:魔法城堡之间都有路径相连:魔法城堡两两之间的到达的距离不同,因此所需时间也可能不会相同.如魔法城堡0到魔法城堡2需要耗时4小时:现,小明想从魔法城堡0到魔法城堡1,他想知道需要花费多少时间:为了快速到达,有一魔法扫把,魔法扫把使用次数有限,使用一次,可以将某一段间的时间减半:求小明从魔法城堡0到魔法城堡1花费的最小时间

百度软件开发(上海站)笔试题解答

软件开发(上海) 简答题 描述OSI(开放系统互联基本参考模型)七层结构: 第七层:应用层,直接对用程序提供服务,应用程序可以变化,但要包括电子消息从传输: 第六层:表示层,格式化数据,以便为应用程序提供通用接口,这可以包括加密服务 第五层:会话层:在两个节点之间建立端连接.此服务包括建立连接是以全双工还是以半双工的方式进行设置,尽管可以再层4中处理双工方式 第四层:传输层,常规数据递送,面向连接或无连接.包括全双工或半双工,流控制和错误恢复服务 第三层:网络层,通过寻址来建立两个结点之间的连接

H3C软件开发笔试面试总结

注:我目前是陕西师范大学计算机科学学院本科生,在西安参加笔试以及面试 先是笔试,我选择的是JAVA方向,笔试选择题目主要是一些基础性的题目,然后简答题问了final.finally.finallize的区别,以及修饰符有几种各有什么区别,还是比较基础的,编程题第一道是求[200,300]内的质数,第二道就是快排. 总的来说笔试相对比较重视基础,客观来说难度一般,但是由于我转JAVA的时间也不是很长,选择中一些考察语言特性的题目还不会,这也是这次笔试中暴露出来的问题. 然后是面试,面试在笔试一周后

atitit.提升软件开发效率大的总结O5

#---平台化.组件化 1 #--cbb公用模块的建设 1 #---内部最佳流程方法跟实践的总结 2 #---内部知识体系的建设 2 #---问题Qa库的建设. 2 #---内部框架/标准类库/api/业务库的建设... 2 #----开发工具集和配置的建设.... 2 #---代码生成跟代码转换工具的集合,互操作等 3 #----经常关注开发语言,类库,框架,工具的新特性,补充到我们的内部框架里面.固化下来. 3 #---代码输入法 3 #----热部署热更新 3 #----DSL & 4gl

2015腾讯笔试大题

今天做完腾讯的在线笔试,感觉自己弱爆了,选择题部分考得比较基础,但是考的面比较广,数据结构,计算机网络,算法常识,概率题,C,C++,都有.大题如下: 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code).请编写一个函数,使用递归方法生成N位的格雷码,并且保证这个函数的健壮性. 2. 有下图的题解,请用C/C++代码来列出满足下图0-100内的所有答案. 3. 如图所示,系统中有三个进程Producer,Transmitter和Consumer.

BZOJ_1221_ [HNOI2001]_软件开发(网络流24题,最小费用流)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1221 n天,每天需要r个毛巾,用完以后可以洗,要么花fa洗a天,要么花fb洗b天,毛巾不够了可以话f买一个,问最少需要多少钱. 分析 把每天拆成两个点:x[i]表示第i天的脏毛巾,y[i]表示第i天要用的毛巾. 1.s向x[i]连弧,容量为r[i],花费为0,表示每天会用脏r[i]条毛巾. 2.x[i]向x[i+1]连弧(注意边界),容量为INF,花费为0,表示把第i天的脏毛巾搁置到第i+1

百度软件开发实习生c++方向面经(一面)

百度2017实习生软件开发(cpp方向) 首先说一下岗位.分为软件开发,开发测试,前端,机器学习数据挖掘,移动开发,据我观察,报的人数来看,软件开发最多,移动开发和开发测试较少.百度前台还准备了吃的喝的,真的是白吃白喝,但是哪里有心情,第一次还是有些紧张.面试地点应该是百度的一餐厅吧,进去后我就惊呆了,没见过大场面啊,人真多.里边全是一对一的,每个面试官都标配mac,真心羡慕. 上来先自我介绍,面试官大概先看了一眼简历,了解了我是非计算机专业的后就问我擅长哪个方面,然后就开干C++,很奇怪为甚么

2019大疆PC软件开发笔试——开关和灯泡两个电路板

题目描述: 小A是一名DIY爱好者,经常制作一些有趣的东西. 今天,小A突然想要来做这样一个东西.小A现在有两块同样大小为n×m,有n×m块大小为1×1小电路板拼成的矩形电路板,假设叫做电路板A和电路板B.电路板A上每个小电路板都是一个开关,电路板B上每个小电路板上都是一盏电灯泡.A与B之间存在如下关系:对于B上的某盏灯Bij的开关控制,有A上第i行与第j列所有开关并联控制.即: 现给一矩阵,表示B上灯泡的明暗状态,问是否存在一种A的开关状态,能够满足给出的B上的灯泡开关情况,如果有输出YES,

BZOJ 1221 HNOI 2001 软件开发/网络流24题 餐巾计划问题 最小费用最大流

题目大意:有一个软件公司,每天需要给一些员工准备消毒毛巾,这些毛巾可以循环利用,但是需要消毒.可以将毛巾送去消毒,有两种方式,A天fA花费,B天fB花费.或者还可以直接买新毛巾,问为了满足员工的需求,至少需要花多少钱. 思路:经典的费用流问题.将每一天拆点,S向每一天<<1连边,约束每一天需要多少毛巾:每一天<<1|1向T连边,约束每一天需要的毛巾.每一天<<1向这一天清洗的毛巾能够使用的那一天<<1|1,注意A和B.毛巾可以延后使用,那么每一天<&l