北大方正的面试题(java),拿给兄弟们看看

kingmaxno1 2005-06-23 09:52:15
1)利用递规算法编写以下程序,计算用不同的正整数加出10000有多少种方法:
10000
=1+9999
=2+9998
=1+2+9997
(注:次序无关,即1+9999与9999+1认为是一种方法


2)利用java中的接口来实现设计模式中的策略模式,需要编写的程序条件如下:
public interface Relation{
boolean Releation(int a,int b);
}
利用上述接口,编写一个函数int GetmaxChainLen(int [] intArray,Reletion reletion);
intArray为一个整数数组,该数组中,如果相邻两个整数a,b使得过且过Relation(a,b)为true,则认为a,b为一段链;
计算该数组中(根据Relation关系)最大的链的长度;如果没有这样的链,返回0;
要求:根据上述条件,代码中要实现GetMaxChaiLen的函数,,还要给出Relation的实现


3)编写一个小程序:
输入:一个文件名,一个特征字符串
输出:报告这个特征字符串在文件中出现的次数
要求:解决问题时要考虑到输入的文件类型可能不是文本类型(text file),而是普通的二进制文件(binary file)输入,
例如:特征字符串为0x1624表示两个连续的二进制位22/36)

分析一下解决问题所使用的算法效率
...全文
1189 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxx1997 2005-06-23
  • 打赏
  • 举报
回复
christom1(一切皆有可能):
递归算法,所以只需要考虑分解成两个正整数相加
cxx1997 2005-06-23
  • 打赏
  • 举报
回复

修正下:
第一题答案:
funtion string GetCount(int num)
{
if (num<1)
return 0;
return GetCount(num-1)+num/2;
}
seekg 2005-06-23
  • 打赏
  • 举报
回复
ky
christom1 2005-06-23
  • 打赏
  • 举报
回复
不晓得是不是我看错题目了。
偶又仔细看了一下:
1)利用递规算法编写以下程序,计算用不同的正整数加出10000有多少种方法:
10000
=1+9999
=2+9998
=1+2+9997
(注:次序无关,即1+9999与9999+1认为是一种方法
为什么你们给的答案都只是把给出的数分解成两个正整数相加呢?
好象不合题意。
恕我愚昧!
cxx1997 2005-06-23
  • 打赏
  • 举报
回复
最简单的 GetCount(4) = 2, 而正确结果应该只有 1+3 = 4 这一种方法???
还有2+2呢?

bistar 2005-06-23
  • 打赏
  • 举报
回复
学习
discolt 2005-06-23
  • 打赏
  • 举报
回复
拿最简单的 GetCount(4) = 2, 而正确结果应该只有 1+3 = 4 这一种方法。

理解没错的话 num/2-1 是两个不同整数的组合方法。
问题是你的递归并没有把所有的加数规定成两个整数。





interhanchi 2005-06-23
  • 打赏
  • 举报
回复
mark
kingmaxno1 2005-06-23
  • 打赏
  • 举报
回复
心情不好,所以没分,郁闷
cxx1997 2005-06-23
  • 打赏
  • 举报
回复
去吃饭拉,88
cxx1997 2005-06-23
  • 打赏
  • 举报
回复
discolt(枫) :
呵呵,你理解错了
推论过程我不想再写拉,西西
discolt 2005-06-23
  • 打赏
  • 举报
回复
int n=0;
n=n+GetCount(num-1);
n=n+num/2-1;
return n;

1.你的每一次递归n 都等于 0

2.我看了一下 n=n+num/2-1;

这个 num/2 - 1 并不是子问题的正确解决。
allenhe 2005-06-23
  • 打赏
  • 举报
回复
第三题KMP
不过有含糊,既然输入是字符串,那0x1624又被认为是2个2进制位。至少也该给出约定,比如0x开头认为是2进制等等,不然不太好做。
不过我估计总是把特征字符串转成byte数组然后binary读入文件比较。

第二题没看懂唉,怎么会是相邻的ab,然后还要求最长链的长度?
cxx1997 2005-06-23
  • 打赏
  • 举报
回复
discolt(枫)
自信没错,不信,你可以算算10的计算个数
呵呵,偶这没编译器,直接用记事本写的,也没测试
XIHSHI 2005-06-23
  • 打赏
  • 举报
回复
UP
discolt 2005-06-23
  • 打赏
  • 举报
回复
第一题答案:
funtion string GetCount(int num)
{
if (num==1)
return 0;
if (num==2)
return 1;
if (num<1)
return 0;
int n=0;
n=n+GetCount(num-1);
n=n+num/2-1;
return n;
}


错了吧

运行结果: GetCount(10) = 17
cxx1997 2005-06-23
  • 打赏
  • 举报
回复
kingmaxno1 (学会飞翔)

虽然没分,但题目不错,就当玩玩了,有问题就发短信给我,我很少来JAVA
cxx1997 2005-06-23
  • 打赏
  • 举报
回复
对第一题答案补充说明:
num/2 在。NET里是取整的,3/2=1

第三题,我不会JAVA,只能说
//根据文件名,获取字节流 (如果文件小,直接进内存,如果文件大,则需要特殊处理)

//解析特征字符串字节流(是否区分大小写,如果不区分,则需要特殊处理)

//搜索 特征字符串字节流,并返回第一个地址,并根据此地址,从之后继续搜索,最终得到次数(递归算法)

--分析效率
//不考虑特殊处理情形
整个文件字节流将读取判断一遍
指针将跳(次数)次

当然没有写具体的方法,也不清楚JAVA是不是有什么特别限制,效率分析的可能不对
cxx1997 2005-06-23
  • 打赏
  • 举报
回复
//第二题答案 如果相邻两个整数a,b使Relation(a,b)为true好象还是没有说明条件啊
public interface Relation{
boolean Releation(int a,int b);
}
public class ChainRelation:interface
{
public boolean Releation(int a,int b)
{
//条件,题目没有说明,假设为A-B<3时,为TRUE
return (a-b<3);
}
}

public class Chain
{
public int GetmaxChainLen(int [] intArray,Reletion reletion)
{
int ChainLength=0;
int oneChainLength=0;
for (int i=0;i<intArray.length-1;i++)
{
if (reletion.Releation(intArray[i],intArray[i+1]))
oneChainLength=oneChainLength+1;
else
if (oneChainLength> ChainLength)
ChainLength= oneChainLength;
}
return ChainLength;
}
}
kingbug 2005-06-23
  • 打赏
  • 举报
回复
友情up
加载更多回复(13)

23,407

社区成员

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

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