某公司笔试题 请大家指教

hejian6462 2009-09-19 07:03:57
输入如下不等式:
例:3+6=3
动一根木棒, 若等式成立,返回true,不成立返回false

提示:1式子中无负数
2输入的数字 在0-9之间
3式子只进行加减运算,等号不能移动
4数字的构成图如下 (没法贴图呀,说一下吧,就如计算器中的数字显示效果,例如:1由两根棒构成,2由5根棒构成,0由6根棒构成...)

如:将“+”中的一更棒移动到3 上 ,就变成了 9-6=3 ;

要求用c编程
用java也行吧,反正是算法多一点,请各位大侠指点。
...全文
521 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hejian6462 2009-10-01
  • 打赏
  • 举报
回复
需要写过程的,不过我笔试的时候也只写了个思路而已。。。
肥虫你真牛!
貌似只要求个位数加减法就行了。。
superliubao 2009-09-23
  • 打赏
  • 举报
回复
是个值得思考的问题。。
adaikiss 2009-09-23
  • 打赏
  • 举报
回复
应该不是一定要你写出可运行的完整代码吧,没IDE不好写,应该是你只要写出个大概思路就可以了
da357085813 2009-09-23
  • 打赏
  • 举报
回复
学习下
bigbug9002 2009-09-21
  • 打赏
  • 举报
回复
楼上不对,
所以,'2'对应的char[2][] 是null
bigbug9002 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bigbug9002 的回复:]
发现有错误:

改为:
Java codetransformation.put('2',newchar[][]{ {'3'},null,null});
2加一根火柴变不成6,和9.
[/Quote]
2加一根火柴什么也变不成,所以[3][]是null.
lxxzhy 2009-09-21
  • 打赏
  • 举报
回复
LED
windforcecn 2009-09-21
  • 打赏
  • 举报
回复
这年头笔试题目这么难啊
kofalex 2009-09-21
  • 打赏
  • 举报
回复
还行 算法应该不是很难 只是考虑的多点map键装0到9 值对应一个10位数组能放入相应火柴,
运算符录入时就以bool型处理 0到9还要接受两种变化多一根火柴和去一根火柴的会形成的新数字的判断,-时前项必定大于后项,+时第三项大于前两项 下班咯
soft53ears 2009-09-21
  • 打赏
  • 举报
回复
还是决定将牛人的代码考下来..到时候研究研究
soft53ears 2009-09-21
  • 打赏
  • 举报
回复
的确看不懂...

这些是程序可以写出来的吗?

难道还可以通过转换运算符
clarence0124 2009-09-21
  • 打赏
  • 举报
回复
笔试的时候真的要这样写那就真神了
24K純帥 2009-09-21
  • 打赏
  • 举报
回复
这个要你自己移还好点,直接要代码很麻烦
  • 打赏
  • 举报
回复
天哪,好复杂,没看懂
bigbug9002 2009-09-20
  • 打赏
  • 举报
回复
发现有错误:

改为:
transformation.put('2',new char[][]{ {'3'},      null,          null});

2加一根火柴变不成6,和9.
bigbug9002 2009-09-20
  • 打赏
  • 举报
回复
F:\java>java MatchMove
测试一
原等式如下:
- - -
| | |
- + - = -
| | | |
- - -
结果
- - -
| | | |
- - - = -
| | | |
- - -
结果:
- - -
| | | |
- + = -
| | | |
- - -
测试二
原等式如下:
- - -
| | | |
- + - = -
|| | |
- - -
结果
- - -
| | | | |
- - - = -
|| | |
- - -
测试三
原等式如下:
- - - - -
| || | | | | | |
- + - = - -
|| | || | | |
- - - - -
结果
- - - - -
| | | || | | | |
- + - = - -
|| | | | | | |
- - - - -
bigbug9002 2009-09-20
  • 打赏
  • 举报
回复
算法不难,但考虑的东西太多.

import java.util.*;
/** transformation是一个Map<Character,char[][]>,存放每一种字符对应的变换.
* char[][]是一个长度为3的二维数组,char[0]是自身变换,char[1]是减一根火柴的变换,char[2]是加一根火柴对就的变换.
* 比如对于'6',对应的char[][]是{ {'0','9'}, {'5'}, {'8'}},表示自身可以变为'0','9',减一根可以变为'5',加一根可一变为'5','8'
*
* symbolPattern<Character,char[][]>,存放每一种字符对应的火柴摆放图案.
*/
public class MatchMove{
public MatchMove(){
transformation.put('0',new char[][]{ {'6','9'}, null, {'8'}});
transformation.put('1',new char[][]{ null, null, {'7'}});
transformation.put('2',new char[][]{ {'3'}, null, {'6','9'}});
transformation.put('3',new char[][]{ {'2'}, null, {'9'}});
transformation.put('4',new char[][]{ null, null, null});
transformation.put('5',new char[][]{ {'3'}, null, {'6','9'}});
transformation.put('6',new char[][]{ {'0','9'}, {'5'}, {'8'}});
transformation.put('7',new char[][]{ null, {'1'}, null});
transformation.put('8',new char[][]{ null, {'0','6','9'}, null});
transformation.put('9',new char[][]{ {'0','6'}, {'3','5'}, {'8'}});
transformation.put('+',new char[][]{ null, {'-'}, null});
transformation.put('-',new char[][]{ null, null, {'+'}});
transformation.put('=',new char[][]{ null, null, null});

symbolPattern.put('0',new char[][]{{' ','-',' '},
{'|',' ','|'},
{' ',' ',' '},
{'|',' ','|'},
{' ','-',' '}
});
symbolPattern.put('1',new char[][]{{' ',' ',' '},
{' ',' ','|'},
{' ',' ',' '},
{' ',' ','|'},
{' ',' ',' '}
});
symbolPattern.put('2',new char[][]{{' ','-',' '},
{' ',' ','|'},
{' ','-',' '},
{'|',' ',' '},
{' ','-',' '}
});
symbolPattern.put('3',new char[][]{{' ','-',' '},
{' ',' ','|'},
{' ','-',' '},
{' ',' ','|'},
{' ','-',' '}
});
symbolPattern.put('4',new char[][]{{' ',' ',' '},
{'|',' ','|'},
{' ','-',' '},
{' ',' ','|'},
{' ',' ',' '}
});
symbolPattern.put('5',new char[][]{{' ','-',' '},
{'|',' ',' '},
{' ','-',' '},
{' ',' ','|'},
{' ','-',' '}
});
symbolPattern.put('6',new char[][]{{' ','-',' '},
{'|',' ',' '},
{' ','-',' '},
{'|',' ','|'},
{' ','-',' '}
});
symbolPattern.put('7',new char[][]{{' ','-',' '},
{' ',' ','|'},
{' ',' ',' '},
{' ',' ','|'},
{' ',' ',' '}
});
symbolPattern.put('8',new char[][]{{' ','-',' '},
{'|',' ','|'},
{' ','-',' '},
{'|',' ','|'},
{' ','-',' '}
});
symbolPattern.put('9',new char[][]{{' ','-',' '},
{'|',' ','|'},
{' ','-',' '},
{' ',' ','|'},
{' ','-',' '}
});
symbolPattern.put('-',new char[][]{{' ',' ',' '},
{' ',' ',' '},
{' ','-',' '},
{' ',' ',' '},
{' ',' ',' '}
});
symbolPattern.put('+',new char[][]{{' ',' ',' '},
{' ',' ',' '},
{' ','+',' '},
{' ',' ',' '},
{' ',' ',' '}
});
symbolPattern.put('=',new char[][]{{' ',' ',' '},
{' ',' ',' '},
{' ','=',' '},
{' ',' ',' '},
{' ',' ',' '}
});
}
/**把str表示的等式通过移动火柴,使等式成立.

*/
public void move(String str){
if(str==null||str.trim().length()==0){
throw new RuntimeException("字符串为空!");
}

String regex="[0-9]+[+-][0-9]+=[0-9]+";
if(!str.matches(regex)){
throw new RuntimeException("给定的字符串格式不对");
}

char[] chars=str.toCharArray();
if(isEquation(chars)){
System.out.println("所给式子本身就是等式");
}

for(int i=0;i<chars.length;i++){
char c=chars[i]; //
char[][] tran=transformation.get(c); //取出关于c字符的所有变换方案.
if(tran[0]!=null){ //字符本身的自变换.
for(char temp : tran[0]){
chars[i]=temp; //自变换的结果替换掉原来的字符.
if(isEquation(chars)){
System.out.println("结果:");
printPattern(chars);
}
chars[i]=c; //复原回到原来的状态.
}
}
if(tran[1]!=null){ //减一根火柴的变换.
for(char temp :tran[1]){
chars[i]=temp; //减一根火柴后的变换结果替换掉原来的字符.
//下面的循环试着把火柴加到每一个除chars[i]之外的字符之上,看等式成立否.
for(int j=0;j<chars.length;j++){
if(i==j){
continue;
}
char c2=chars[j];
char[][] tran2=transformation.get(c2);
if(tran2[2]!=null){
for(char temp2 : tran2[2]){
chars[j]=temp2; //chars[j]加一根火柴.
if(isEquation(chars)){
System.out.println("结果");
printPattern(chars);
}
chars[j]=c2; //复原chars[j].
}
}

}
chars[i]=c; //复原chars[i].
}

}
}
return;
}
//测试:

public static void main(String[] args){
MatchMove mm=new MatchMove();
System.out.println("测试一");
System.out.println("原等式如下:");
mm.printPattern("3+6=3");
mm.move("3+6=3");
System.out.println("测试二");
System.out.println("原等式如下:");
mm.printPattern("12+3=5");
mm.move("12+3=5");
System.out.println("测试三");
System.out.println("原等式如下:");
mm.printPattern("90+12=69");
mm.move("90+12=69");
}
public void printPattern(String str){
printPattern(str.toCharArray());
}
private Map<Character,char[][]> transformation=new HashMap<Character,char[][]>();
private Map<Character,char[][]> symbolPattern=new HashMap<Character,char[][]>();

/**判断equation字符数组中存放的等式能不能成立.
*/
private boolean isEquation(char[] equation){
int num1=0;
int num2=0;
int num3=0;
char operator;
int index=0;
for(;Character.isDigit(equation[index]);index++){
num1=num1*10+equation[index]-'0';
}
operator=equation[index++];
for(;Character.isDigit(equation[index]);index++){
num2=num2*10+equation[index]-'0';
}
index++;
for(;index<equation.length;index++){
num3=num3*10+equation[index]-'0';
}
//System.out.println(num1+" "+operator+num2+"="+num3);
if(operator=='-'){
return num1-num2==num3;
}else{
return num1+num2==num3;
}
}

/**打印cs中存放的等式
*/
private void printPattern(char[] cs){
for(int i=0;i<5;i++){
for(int j=0;j<cs.length;j++){
char[][] temp=symbolPattern.get(cs[j]);
for(int k=0;k<temp[i].length;k++){
System.out.print(temp[i][k]);
}
}
System.out.println();
}
}
}
cantalou 2009-09-20
  • 打赏
  • 举报
回复
3+0
wkklun22 2009-09-20
  • 打赏
  • 举报
回复
搞java的刚开始学习时对算法要求不高
wkklun22 2009-09-20
  • 打赏
  • 举报
回复
搞java的刚开始学习时对算法要求不高
加载更多回复(2)
【对于深入学习C语言编程,这本书很不错,建议大家一定读读!】 +++++++++++++++++++++++++++++++++++++++++++ ............................ ............................ 学习C 语言,这几本书如果真正啃透了,水平不会差到哪。与其说本书是我授课的经验与心得,不如说本书是我对这些大师们智慧的解读。本书并不是从头到尾讲解C 语言的基础知识,所以,本书并不适用于C 语言零基础的人。本书的知识要比一般的C 语言书说讲的深的多,其中有很多问题是各大公司的面试或笔试题。所以本书的读者应该是中国广大的计算机系的学生和初级程序员。如果本书上面的问题能真正明白80%,作为一个应届毕业生,肯怕没有一家大公司会拒绝你。当然,书内很多知识也值得计算机教师或是中高级程序员参考。尤其书内的一些例子或比方,如果能被广大教师用于课堂,我想对学生来说是件非常好的事情。有人说电影是一门遗憾的艺术,因为在编辑完成之后总能或多或少的发现一些本来可以做得更好的缺陷。讲课同样也如此,每次讲完课之后总能发现自己某 些地方或是没有讲到,或是没能讲透彻或是忘了举一个轻浅的例子等等。整理本书的过程也是,为了尽量精炼,总是犹豫一些东西的去留。限于作者水平,书中难免有些遗漏甚至错误,希望各位读者能予指教。 .............................. ..............................

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧