算法讨论~

liaoyi_ipanel 2008-11-03 04:52:31
题目是C++版块上的,我想用java实现:
http://topic.csdn.net/u/20081102/11/1c6136bb-ad44-49e1-868b-d848816456f6.html

最笨的算法(计算111111111需要78秒....):

package cn.array;

/**
* 计算enterNum之前正数所有1的个数,比如:1->1;10->2;11->4;12->5.......
* @author liaoyi
* @version 1.0.0
* @2008-11-3 下午03:22:10
*/
public class HasOne {

public static void main(String args[]) {
System.out.println(new HasOne().f(111111111));
}

public int f(int enterNum){
int oneNum = 1;
for(int i=enterNum;i>1;i--){
String strNum = new Integer(i).toString();
for(int j = 0;j<strNum.length();j++){
if(strNum.substring(j, j+1).equals("1"))
oneNum++;
}
}
return oneNum;
}

}


大家讨论一下~
...全文
489 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2008-11-08
  • 打赏
  • 举报
回复
楼主的算法,
charAt方法,要比substring的效率要高,因为楼主只是想比较某一个字符。
试试if(strNum.charAt(j)=='1')...
应该会快很多。

当然,支持使用 用数学计算的方法。
ilstar 2008-11-08
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 lingxixiaopang 的回复:]
Java code
int x =111111111;
int result = 0;
long start = System.nanoTime();//纪录循环开始时间
for( int i=10; i<=x*10; i=i*10) {
result += x/i*(i/10);//默认当前位数是0
if (x%i/(i/10)==1) {//当前位数是1
result += x%(i/10)+1;
}else if(x%i/(i/10)>1) {//当前位数大于1
result += i/10;

[/Quote]

支持他的,确实是非常快,这个时间复杂度是O(数的位数),我觉得不可能更快了
「已注销」 2008-11-06
  • 打赏
  • 举报
回复
吃饭去,一会上课了,不看了,

脑子有点乱了

KAO
lingxixiaopang 2008-11-06
  • 打赏
  • 举报
回复

int x =111111111;
int result = 0;
long start = System.nanoTime();//纪录循环开始时间
for( int i=10; i<=x*10; i=i*10) {
result += x/i*(i/10);//默认当前位数是0
if (x%i/(i/10)==1) {//当前位数是1
result += x%(i/10)+1;
}else if(x%i/(i/10)>1) {//当前位数大于1
result += i/10;
}
}
long end = System.nanoTime();//结束时间
System.out.println("花费时间:"+(end-start)+"毫微秒");
System.out.println(result);


修改了一下测试时间的精度 System.nanoTime();这个是毫微秒级的

测试结果:
花费时间:3254毫微秒
100000008
wonflay 2008-11-06
  • 打赏
  • 举报
回复
mark
kxy4341 2008-11-06
  • 打赏
  • 举报
回复
想快 数学必须要说得过得去,(看过小学奥数)
用大量除的,大量mod的基本上很慢,
用字符串的,速度差10^6倍吧
getter 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 lingxixiaopang 的回复:]
引用 47 楼 getter 的回复:
引用 46 楼 lingxixiaopang 的回复:
Java code int x =111111111;
int result = 0;
int testresult = 0;
long start = System.currentTimeMillis();//纪录循环开始时间
for( int i=10; i <=x*10; i=i*10) {
result += x/i*(i/10);//默认当前位数是0
if (x%i/(i/10)==1) {//当前位数是1
result += x%(i/10)…
[/Quote]
嗯,記得以前做個運行時間很長的測試,得出來也是幾十millisecond...
lingxixiaopang 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 getter 的回复:]
引用 46 楼 lingxixiaopang 的回复:
Java code int x =111111111;
int result = 0;
int testresult = 0;
long start = System.currentTimeMillis();//纪录循环开始时间
for( int i=10; i <=x*10; i=i*10) {
result += x/i*(i/10);//默认当前位数是0
if (x%i/(i/10)==1) {//当前位数是1
result += x%(i/10)+1;
}else if(x…
[/Quote]

我这里加时间主要是为了和
long teststart = System.currentTimeMillis();
for (int i=0; i<=x; i++) {
String s = i+"";
String s1 = s.replaceAll("1", "");
testresult +=s.length()-s1.length();
}
long testend = System.currentTimeMillis();


这个较慢的算法作比较,所以时间精度很低的,时间精度高的我也不会, 呵呵 还望高手指点下 求运行时间的方法
lingxixiaopang 2008-11-05
  • 打赏
  • 举报
回复
这个时间是毫秒级的, 所以这个循环应该是一毫秒都用不到,如果用比较麻烦的算法超过一毫秒它就会起作用了
getter 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 lingxixiaopang 的回复:]
Java code int x =111111111;
int result = 0;
int testresult = 0;
long start = System.currentTimeMillis();//纪录循环开始时间
for( int i=10; i<=x*10; i=i*10) {
result += x/i*(i/10);//默认当前位数是0
if (x%i/(i/10)==1) {//当前位数是1
result += x%(i/10)+1;
}else if(x%i/(i/10)>1) {//当前位数大于1

[/Quote]
這樣算時間好像沒用的,我剛剛也這樣算,兩個時間一樣的...
lingxixiaopang 2008-11-05
  • 打赏
  • 举报
回复
 int x =111111111;
int result = 0;
int testresult = 0;
long start = System.currentTimeMillis();//纪录循环开始时间
for( int i=10; i<=x*10; i=i*10) {
result += x/i*(i/10);//默认当前位数是0
if (x%i/(i/10)==1) {//当前位数是1
result += x%(i/10)+1;
}else if(x%i/(i/10)>1) {//当前位数大于1
result += i/10;
}
}
long end = System.currentTimeMillis();//结束时间
System.out.println("花费时间:"+(end-start));
System.out.println(result);



---测试结果
花费时间:0
100000008
liaoyi_ipanel 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 getter 的回复:]
引用 41 楼 liaoyi_ipanel 的回复:
引用 40 楼 getter 的回复:
我的雖然是遞歸,但也是運行"位數"次而己,不過好像沒人在意,是不是做錯了呢?

我运行了好象不对,
111111111应该是有100000008个1
而你的运行是22222324.

你誤導我,我剛運行了一下
我也是100000008
[/Quote]
.....搞错了参数,
现在去看下代码,呵呵~
谢谢指教~
getter 2008-11-05
  • 打赏
  • 举报
回复
ccccc(111111111, 100000000, 1);第一個參數是n,第二個是你的位數,兩位數100,三位數1000,so forth,第三個是你要找的數字
getter 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 liaoyi_ipanel 的回复:]
引用 40 楼 getter 的回复:
我的雖然是遞歸,但也是運行"位數"次而己,不過好像沒人在意,是不是做錯了呢?

我运行了好象不对,
111111111应该是有100000008个1
而你的运行是22222324.
[/Quote]
你誤導我,我剛運行了一下
我也是100000008
getter 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 liaoyi_ipanel 的回复:]
引用 40 楼 getter 的回复:
我的雖然是遞歸,但也是運行"位數"次而己,不過好像沒人在意,是不是做錯了呢?

我运行了好象不对,
111111111应该是有100000008个1
而你的运行是22222324.
[/Quote]
嗯,謝謝
liaoyi_ipanel 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 getter 的回复:]
我的雖然是遞歸,但也是運行"位數"次而己,不過好像沒人在意,是不是做錯了呢?
[/Quote]
我运行了好象不对,
111111111应该是有100000008个1
而你的运行是22222324.
getter 2008-11-05
  • 打赏
  • 举报
回复
我的雖然是遞歸,但也是運行"位數"次而己,不過好像沒人在意,是不是做錯了呢?
zhangpeng9886123 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 justinavril 的回复:]
你完全可以用字符串替换来做啊,看看我的这篇blog 有些是可以借鉴的 http://blog.csdn.net/justinavril/archive/2008/10/19/3105566.aspx

就是把他们连接成一个字符串 然后把字符串1全部替换掉 然后看字符串长度的差值
[/Quote]
好办法 值得学习
沉心415 2008-11-05
  • 打赏
  • 举报
回复
关注中!
lingxixiaopang 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 lingxixiaopang 的回复:]
Java codeint x =11111111;
int result = 0;
int testresult = 0;
long start = System.currentTimeMillis();
for( int i=10; i<=x*10; i=i*10) {
result += x/i*(i/10);//默认当前位数是0
if (x%i/(i/10)==1) {//当前位数是1
result += x%(i/10)+1;
}else if(x%i/(i/10)>1) {//当前位数大于1
result += i/10;

[/Quote]

我的算法复杂度只是n的位数次循环 应该是最低的 下面的转成string的原始算法只是比较,谁知这样一来大家就看不出来了,郁闷中。。。。。,
加载更多回复(40)
  在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。 《算法导论(原书第3版)》选材经典、内容丰富、结构合理、逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教材,在it专业人员的职业生涯中,本书也是一本案头必备的参考书或工程实践手册。    第3版的主要变化:    新增了van emde boas树和多线程算法,并且将矩阵基础移至附录。    修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。    移除两章很少讲授的内容:二项堆和排序网络。    修订了动态规划和贪心算法相关内容。    流网络相关材料现在基于边上的全部流。    由于关于矩阵基础和strassen算法的材料移到了其他章,矩阵运算这一章的内容所占篇幅更小。    修改了对knuth-morris-pratt字符串匹配算法讨论。    新增100道练习和28道思考题,还更新并补充了参考文献。

62,610

社区成员

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

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