论坛首页 招聘求职论坛

深圳两个上机题,求讨论!

浏览 31624 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-22  
哦,不好意思,看错了,不能有0出现的。。。
0 请登录后投票
   发表时间:2010-07-22   最后修改:2010-07-22
biaobiao520 写道
第一个:写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。如:传递表达式"1+2*3+6-2/2"返回计算的结果。

用javascript eval执行。

第二个:9个数1-9组成三个数,如:327 654 981,每个数字只能用一次,每三个数字组成一个新的数字,第二个数是第一个数的两倍,第三个数是第一个数的三倍,用程序实现。
9个数字的排列组合共计9!个,检查其中可以被1002003整除的。

我的实现:
第一个:把传进来的字符串解串,用了以个while循环,只要碰到"+","-","*","/"就记录符号的index,计算index两边的值,然后再组成新的字符串返回,当字符串的长度为一的时候,就是最后的值。因为当时时间紧急,考虑的不是很全面。

第二个:用程序实现不了,但总结了三点规律:
1、三个数的百位数必须是倍数关系 如327 654 981 和 219 438 657 百位数分别为3 6 9和2 4 6
2、三个数的十位数必须均值递增,如上十位数为别为2 5 8和1 3 5
3、三个数的个位数必须均值递减,如上个位数分别为7 4 1和9 8 7

请教大家评论及指点!


恩,思路两分钟,程序5分钟,调试检查3分钟。10分钟搞定。
0 请登录后投票
   发表时间:2010-07-22  
第一个最传统的算法是分为数字栈和符号栈,压栈处理。这是大学时候的作业题啊。
0 请登录后投票
   发表时间:2010-07-22  
第一个就是数据结构书里面栈的那一章的表达式求值\
第二个说实话实在没什么难度.
0 请登录后投票
   发表时间:2010-07-22   最后修改:2010-07-22
第一道不知有没更好的方法呢? 留意牛人中~~
第二道;
Set contain = new HashSet();
for (int i = 100; i < 333; i++) {
  contain.clear();
  String result = String.valueOf(i)+2*i+3*i;
  if(result.indexOf("0")>0) continue;
  for(char ch : result.toCharArray())  
     contain.add(ch);
  if(contain.size() == result.length())
     System.out.println(String.valueOf(i)+" "+2*i+" "+3*i);
}

结果:
192 384 576
219 438 657
273 546 819
327 654 981
1 请登录后投票
   发表时间:2010-07-22   最后修改:2010-07-22
看到回复的有思路相同的,但是这里这样限制一下范围会更好:

public static void main(String[] args) {  	  
        String temp = "";  
        int t1=0;
        int t2=0;
        for(int i=134;i<328;i++){  
        	if(i/10==30)
        	{
        		i+=10;
        		continue;
        	}
        	t1=i*2;
        	t2=i*3;
            temp=""+i+t1+t2;  
            byte[] b = temp.getBytes();  
            Arrays.sort(b);  
            temp = new String(b);  
            if(temp.equals("123456789")){  
                System.out.println(i+";"+t1+";"+t2);  
            }  
        }    
} 


其中的328和134都不是乱取的,可以自己思考一下,刚才看了一下大家都有很多思路的引导
还有,lz的思路我觉得应该是不对的
0 请登录后投票
   发表时间:2010-07-22  
384444165 写道
看到回复的有思路相同的,但是这里这样限制一下范围会更好:

public static void main(String[] args) {  	  
        String temp = "";  
        int t1=0;
        int t2=0;
        for(int i=134;i<328;i++){  
        	if(i/10==30)
        	{
        		i+=10;
        		continue;
        	}
        	t1=i*2;
        	t2=i*3;
            temp=""+i+t1+t2;  
            byte[] b = temp.getBytes();  
            Arrays.sort(b);  
            temp = new String(b);  
            if(temp.equals("123456789")){  
                System.out.println(i+";"+t1+";"+t2);  
            }  
        }    
} 


其中的328和134都不是乱取的,可以自己思考一下,刚才看了一下大家都有很多思路的引导
还有,lz的思路我觉得应该是不对的


329可以确定。
<34X
<33X
0 请登录后投票
   发表时间:2010-07-22  
针对第一个问题,我试着写了写代码,发上来,供大家交流。


public class MyTest {
	/**
	 * 第一个:写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。
	 * 如:传递表达式"4-(4-3*5+(2*4)+100)/10"返回计算的结果。
	 * 注意:注释掉的System.out.println为字符串递归解析过程。大家查看时可以把注释去掉,str1、str2、str3分别打印。
	 * */
	public double getResult(String str){
		double d = 0d;
		
		boolean flag = true;//默认只是一个数字
		int k = 0;//0-括号闭合,遇到一个')'就减一,遇到一个'('就加一
		//1 算加减,因为加减是左运算,所以倒序遍历
		for(int i=str.length()-1;i>=0;i--){
			char c = str.charAt(i);
			if(c==')'){
				k--;
			}else if(c=='('){
				k++;
			}
			
			if(k==0){
				if(c=='+'){
					flag = false;
//					System.out.println(str.substring(0, i)+"  +  "+str.substring(i+1));
					d = this.getResult(str.substring(0, i)) + this.getResult(str.substring(i+1));
					break;
				}else if(c=='-'){
					flag = false;
//					System.out.println(str.substring(0, i)+"  -  "+str.substring(i+1));
					d = this.getResult(str.substring(0, i)) - this.getResult(str.substring(i+1));
					break;
				}
			}
		}
		//2 算乘除,因为乘除是左运算,所以倒序遍历
		if(flag){
			for(int i=str.length()-1;i>=0;i--){
				char c = str.charAt(i);
				if(c==')'){
					k--;
				}else if(c=='('){
					k++;
				}
				
				if(k==0){
					if(c=='*'){
						flag = false;
//						System.out.println(str.substring(0, i)+"  *  "+str.substring(i+1));
						d = this.getResult(str.substring(0, i)) * this.getResult(str.substring(i+1));
						break;
					}else if(c=='/'){
						flag = false;
//						System.out.println(str.substring(0, i)+"  /  "+str.substring(i+1));
						d = this.getResult(str.substring(0, i)) / this.getResult(str.substring(i+1));
						break;
					}
				}
			}
		}
		//3 算括号
		if(flag){
			if(str.charAt(0)=='('){
				flag = false;
//				System.out.println(str.substring(1, str.length()-1));
				d = this.getResult(str.substring(1, str.length()-1));
			}
		}
		//4 算数字
		if(flag){
			d = Double.parseDouble(str);
		}
		
		return d;
	}

	public static void main(String[] args) {
		MyTest mt = new MyTest();
		String str1 = "1+2*3+6-2/2";
		System.out.println(str1+" = "+mt.getResult(str1));
		String str2 = "4-(4-3*5+(2*4)+100)/10";
		System.out.println(str2+" = "+mt.getResult(str2));
		String str3 = "(4-3*(5+2*4)+100)/(10+2/1)";
		System.out.println(str3+" = "+mt.getResult(str3));
	}

}
0 请登录后投票
   发表时间:2010-07-23   最后修改:2010-07-23
import java.util.ArrayList;
import java.util.List;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test t = new Test();
		List<String> l = t.str();
		for (String s : l) {
			int m = 0;// 控制字符串中是否有相同的字符,如果存在m++
			int n = 0;// 控制m的个数
			for (int i = 0; i < s.length(); i++) {
				for (int j = i + 1; j < s.length(); j++) {
					String a = s.substring(i, i + 1);
					String b = s.substring(j, j + 1);
					if (a.equals(b)) {
						m++;
					}
				}
				if (m == 0) {
					n++;
				}
			}
			if (n == s.length()) {
				System.out.println(s.substring(0, 3) + "," + s.substring(3, 6)
						+ "," + s.substring(6, 9));
			}
		}
	}

	public List<String> str() {// 过滤出3个三位数m,m*2,m*3,且这3个数自身没有由相同的数字和0组成,例:123,246,369
		List<String> list = new ArrayList<String>();
		for (int i = 100; i < 1000 / 3; i++) {
			if (!(i / 100 == i % 100 / 10 || i / 100 == i % 100 % 10
					|| i % 100 / 10 == i % 100 % 10 || i % 100 / 10 == 0 || i % 100 % 10 == 0)) {
				int m = i * 2;
				if (!(m / 100 == m % 100 / 10 || m / 100 == m % 100 % 10
						|| m % 100 / 10 == m % 100 % 10 || m % 100 / 10 == 0 || m % 100 % 10 == 0)) {
					int k = i * 3;
					if (!(k / 100 == k % 100 / 10 || k / 100 == k % 100 % 10
							|| k % 100 / 10 == k % 100 % 10
							|| k % 100 / 10 == 0 || k % 100 % 10 == 0)) {
						String s0 = String.valueOf(i);
						String s1 = String.valueOf(m);
						String s2 = String.valueOf(k);
						StringBuffer sb = new StringBuffer();
						String total = sb.append(s0).append(s1).append(s2)
								.toString();
						list.add(total);
					}
				}
			}
		}
		return list;
	}
}

 

0 请登录后投票
   发表时间:2010-07-23  
qiushily2030 写道
第一道不知有没更好的方法呢? 留意牛人中~~
第二道;
Set contain = new HashSet();
for (int i = 100; i < 333; i++) {
  contain.clear();
  String result = String.valueOf(i)+2*i+3*i;
  if(result.indexOf("0")>0) continue;
  for(char ch : result.toCharArray())  
     contain.add(ch);
  if(contain.size() == result.length())
     System.out.println(String.valueOf(i)+" "+2*i+" "+3*i);
}

结果:
192 384 576
219 438 657
273 546 819
327 654 981


仁兄对Java中的集合理解甚深啊!学习了!
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics