`
jiang5495
  • 浏览: 93024 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

深圳两个上机题之我的解答

J# 
阅读更多
在些声明此两题是论坛上一人的上机试题,解答是本人写的!

原题如下:
第一个:写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。如:传递表达式"1+2*3+6-2/2"返回计算的结果。

第二个:9个数1-9组成三个数,如:327 654 981,每个数字只能用一次,每三个数字组成一个新的数字,第二个数是第一个数的两倍,第三个数是第一个数的三倍,用程序实现。

关于第一题我的解答如下:
package com.jishi.shenzheng;

import java.util.Stack;

//解决的第一个BUG为当遇到的运算符出栈时,要直到栈空或栈顶元素的优先组小于当前字符时才能执行入栈操作
//解决的第二个BUG为开妈没有考虑在字符串中处理多位数
public class First {

	// 对表达式进行求值运算
	public static double evaluation(String expression) {
		expression = pretreatment(expression);
		// 引入一个字符栈,用来存放在表达式中出现过的运算符
		Stack<Character> Chstack = new Stack<Character>();
		// 引入一个数字栈,用来存放在表达式中出现过的运算数
		Stack<Double> Dostack = new Stack<Double>();
		// 扫描表达式
		for (int i = 0; i <= expression.length() - 1; i++) {
			 Character ch = expression.charAt(i);
			// 处理表达式中出现的数字
			if (Character.isDigit(ch)) {  //其中扫描到数字时并不是这么容易处理,要考虑多们数的情况
				StringBuilder sb=new StringBuilder();
				sb.append(ch);
				//这个while循环用来处理字符串中的实数或多位数
				while((i+1<=expression.length()-1)&&(Character.isDigit(expression.charAt(i+1))||expression.charAt(i+1)=='.')){
				   sb.append(expression.charAt(i+1));
					i++;
				}
			 	Dostack.push(Double.parseDouble(sb.toString()));
			} else { // 处理表达式中出现的运算符
				if (ch == '(') {
					Chstack.push(ch);
				} else if (ch == ')') { // 遇到右括号的情况较为复杂,稍后考虑
                     do{
                    	char operator=Chstack.pop(); 
                    	if(operator=='(') break;
                    	double d1=Dostack.pop();
                    	double d2=Dostack.pop();
                    	double answer=operation(d1,d2,operator);
                    	Dostack.push(answer);
                    	ch=operator;
                     }while(ch!='(');  //直到栈中弹出左括号为止
                  } else { // 遇到的是普通的运算符
					if (Chstack.isEmpty()) { // 栈空的话直接入栈
						Chstack.push(ch);
					} else { // 栈非空则根据优先级入栈
                        int uppriority=priority(ch);
                        int downpriority=priority(Chstack.peek());
                        if(downpriority==0){ //如果此时栈顶为左括号则直接入栈
                        	Chstack.push(ch);
                        }else{
                        	int priority=uppriority-downpriority;
                        	if(priority<=0){ //如果新入本的运算符优先级比栈顶运算符低,此处处理稍微麻烦一点点
                        		do{   //新加入的do_while循环是为了解决第一次遇到的Bug的
                        	    char operator=Chstack.pop();
                        	    //Chstack.push(ch); //此时的栈顶元的优先仍需判断,此时入栈为时尚早
                        		double d1=Dostack.pop();
                        		double d2=Dostack.pop();
                        		double answer=operation(d1,d2,operator);
                        		Dostack.push(answer);
                        		if(Chstack.empty()) break;
                        		downpriority=priority(Chstack.peek());
                        		if(downpriority==0) break;
                         	    priority=uppriority-downpriority;
                        		}while(priority<=0);
                        		Chstack.push(ch);
                        	}else{//如果新入本的运算符优先级比栈顶运算符高则直接入栈即可
                        		Chstack.push(ch);
                        	}
                        }
					}
				}
			}
		}
		
		//返回栈顶元素,即为表达式结果
	    while(!Chstack.empty()){
	    	char operator=Chstack.pop();
    		double d1=Dostack.pop();
    		double d2=Dostack.pop();
    		double answer=operation(d1,d2,operator);
    		Dostack.push(answer);
	    }
	    return Dostack.pop();
	}

	// 对表达式进行预处理,主要是为了解决负数运算问题
	public static String pretreatment(String expression) {
		// 如果负号出现在表达式首部,则易处理在前面加0即可
		if (expression.charAt(0) == '-') {
			expression = "0" + expression;
		}
		// 处理负数出现在非首部的情况
		expression = expression.replace("(-", "(0-");
		return expression;
	}

	//判断运算符的优先级
	public static int priority(char ch) {
		switch (ch) {
		case '+':		return 1;
		case '-':       return 1;
		case '*':       return 2;
		case '/':       return 2;
		default:    	return 0;
		}
	}
	
	//处理简单的运算
    public static double operation(double d1,double d2,char ch){
        switch(ch){
        case '+':return d1+d2;
        case '-':return d2-d1;
        case '*':return d1*d2;
        case '/':return d2/d1;
        default:return 0;
        }
    }
	
	public static void main(String[] args) {
		//测试表达式求值
		System.out.println("2.5+3="+First.evaluation("2.5+3"));
		System.out.println("(2.5+2)*(2-4)="+evaluation("(2.5+2)*(2-4)"));
		System.out.println("-3+(-4)+(5*2+(-3+4)+6)/4+8="+evaluation("-3+(-4)+(5*2+(-3+4)+6)/4+8"));
		System.out.println("3+5-6*3+4/2="+evaluation("3+5-6*3+4/2"));
		 
	   
	}

}
运行结果如下:
2.5+3=5.5
(2.5+2)*(2-4)=-9.0
-3+(-4)+(5*2+(-3+4)+6)/4+8=5.25
3+5-6*3+4/2=-8.0


关于第二题我的解答如下:
package com.jishi.shenzheng;
//经典回溯思想
public class Second {
   public static void dfs(int[] a,int n){
		if(n>a.length-1){
			int s1=a[0]*100+a[1]*10+a[2];
			int s2=a[3]*100+a[4]*10+a[5];
			if(s2!=s1*2) return;
			int s3=a[6]*100+a[7]*10+a[8];
			if(s3==3*s1){
				System.out.println(s1+";"+s2+";"+s3);
			}
		}else{
			for(int i=1,j;i<=9;i++){
				for(j=0;j<n;j++){
					if(i==a[j]){
						break;
					}
				}
				if(j<n){
					continue;
				}else{
					a[n]=i;
				    dfs(a,n+1);
				}
			}
		}
	}
	
	public static void main(String[] args){
		int[] a=new int[9];
		dfs(a,0);
	}
	
}
运行结果如下:
192;384;576
219;438;657
273;546;819
327;654;981

3
1
分享到:
评论

相关推荐

    编译原理基础习题与上机题解答 西电出版社 刘坚

    编译原理基础习题与上机题解答 西电出版社 刘坚 编译原理基础习题与上机题解答 西电出版社 刘坚

    编译原理基础习题与上机题解答

    本书是《编译原理基础》(2002年2月出版,刘坚编著)的教学辅导书,内容包括两部分:习题解答,上机题与参考解决方案,并在附录中给出了源程序清单。 本书可以作为工科院校计算机专业或非计算机专业编译原理程课的...

    c#上机习题 c#上机习题

    在第一题中,我们需要创建一个控制台应用,利用特定公式计算`q`的近似值。这涉及到基本的输入输出操作,如`Console.WriteLine()`和`Console.ReadLine()`,以及数学运算。 2. **字符串处理与文件操作**:第二题涉及...

    数据结构(课件、习题答案、上机题答案)

    本资源包包含了“数据结构”课程的电子课件、习题答案以及上机题答案,对于学习者来说是一份宝贵的资料。 一、课件部分 数据结构的电子课件通常涵盖了以下几个主要章节: 1. 引言:介绍数据结构的基本概念,包括...

    北航计算机学院复试上机往年试题及解答.zip

    本压缩包文件“北航计算机学院复试上机往年试题及解答.zip”包含了历年来的复试上机考试题目以及相关的解答,这对于考生备考具有极高的参考价值。 首先,我们要明确“考研复试”的含义。考研复试是研究生入学考试的...

    ADO.NET考试上机题

    ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试...

    ACCESS上机真题题库软件

    本软件包括了二级ACCESS上机真题题库,二级ACCESS历年真题,涵盖了所有的模拟题

    厦门大学 保研 考研 上机真题 历年真题以及详解.zip

    希望这份资源能帮助每一个有志于厦门大学计算机类专业的学子,站在前人的肩膀上,更轻松地迈向成功之路。 总的来说,这份厦门大学保研考研上机真题及详解资源是一份宝贵的备考资料,它为考生提供了宝贵的实践机会和...

    C语言上机题库150题

    考研复试上机题库,C语言实现,可以提升上机熟练度,对于计算机专业同学来说是必不可少的

    c#上机试题练习及答案

    在这些C#上机试题中,我们可以学习到多个核心知识点,包括条件判断、循环、异常处理、类与对象、属性、事件、数组操作、方法重载以及颜色操作等。下面我们将逐一深入探讨: 1. 条件判断与循环:题(1)要求找出1到...

    最全华为上机试题及部分答案

    在这个题目中,考生需要编写一个函数来比较两个数组,从数组最后一个元素开始逐个元素向前比较,如果两个数组的长度不等,则只比较较短长度数组的元素。函数返回比较中发现的不相等元素的个数。 代码实现如下: ```...

    操作系统上机题

    在操作系统的学习中,上机题是检验理论知识理解和应用能力的重要环节。北京大学的操作系统上机题目通常会涵盖操作系统的核心概念,如进程管理、内存管理和调度算法等。 在上机题中,进程调度是常见的主题。进程调度...

    JavaScript上机实验题

    ### JavaScript上机实验题知识点概览 #### 一、JavaScript表达式和逻辑控制语句的使用 ##### 实验目的 1. **理解变量**: 学习如何声明变量、初始化变量及变量的作用范围。 2. **数据类型掌握**: 包括基本数据类型...

    浙江大学C程上机题题库答案

    【浙江大学C程上机题题库...总的来说,【浙江大学C程上机题题库答案】是一个全面且实用的学习资源,对于想要提升C语言编程技能的初学者来说,它提供了宝贵的实践机会和详尽的解答,有助于他们在编程之路上稳步前行。

    MySQL上机考试题(习题,答案).docx

    MySQL上机考试题(习题,答案).docx

    华科历年上机题

    在【新建文件夹 (2)】中,可能包含了多个子文件或子文件夹,它们可能按照年份或者题型分类存放历年上机题的题目描述、输入输出样例以及参考解答。考生应该逐一打开并仔细阅读每个文件,理解每道题目的要求,分析其...

    Java编程上机试题

    在解答Java编程上机试题时,考生应具备良好的编程习惯,注重代码的可读性和可维护性。同时,Oracle上机试题则更侧重于实际数据库操作和管理能力,要求对SQL语言有深入的理解。通过这些试题的练习,学习者可以提升...

    二级C语言上机题题库大全

    在第3题中,我们可以看到一个字符串比较的例子,函数fun()的功能是逐个比较a、b两个字符串对应位置中的字符,把ASCII值小或相等的字符依次存放到c数组中,形成一个新的字符串。 知识点6:函数编程 在第3题中,我们...

    前端上机面试题

    在前端上机面试中,经常会遇到要求实现一系列交互功能,如数据渲染、筛选、分页以及导航等。根据提供的描述,以下是对这些知识点的详细解释: 1. **数据渲染**: - 使用JavaScript(通常结合HTML和CSS)来动态显示...

Global site tag (gtag.js) - Google Analytics