以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 算法理论与分析 』  (http://bbs.xml.org.cn/list.asp?boardid=60)
----  [分享]上次笔试题目,抛砖引玉  (http://bbs.xml.org.cn/dispbbs.asp?boardid=60&rootid=&id=29068)


--  作者:wcdxyl
--  发布时间:3/22/2006 4:25:00 PM

--  [分享]上次笔试题目,抛砖引玉
import java.util.Calendar;
/**
 一个自然数n,求从1开始到这个数之间有多少个1。
 比如11就有3个1
*/


class FN{

 public long getFN(long n){
  long num = 0;

  for(long  i = 1;i<=n;i++){ //1,2,3,4.....
   String allnum = String.valueOf(i);
   if(allnum.indexOf("1")==-1) continue;//去掉没有1的

   for(int j = 0;j<allnum.length();j++){//遍历之间的每个数
    if((allnum.substring(j).indexOf("1"))!=-1) num++;
   }
  }
  return num;
 }

 public static void main(String[] args){
  if(args[0]!=null){
   Calendar c = Calendar.getInstance();
   long start = c.getTimeInMillis();

   long param = Long.parseLong(args[0]);
   System.out.println(new FN().getFN(param));

   Calendar b = Calendar.getInstance();
   long end = b.getTimeInMillis();
   System.out.println(end-start);

  }
 }
}

这个算法求数18991耗时100毫秒,考官说好的可以十几毫秒


--  作者:DavidPotter
--  发布时间:6/15/2006 6:26:00 PM

--  
穷举也太死板了,应该分析给定参数来判断。
ps: 楼主的算法不对吧。
for(int j = 0;j<allnum.length();j++){//遍历之间的每个数
    if((allnum.substring(j).indexOf("1"))!=-1) num++;
如果数是21那么这时你的num++应该走了2次。还不如用charAt(j);



--  作者:zhangmei1988521
--  发布时间:6/15/2006 10:36:00 PM

--  
穷举也太死板了,应该分析给定参数来判断。
ps: 楼主的算法不对吧。
for(int j = 0;j<allnum.length();j++){//遍历之间的每个数
    if((allnum.substring(j).indexOf("1"))!=-1) num++;
如果数是21那么这时你的num++应该走了2次。还不如用charAt(j);


--  作者:jassyking
--  发布时间:6/17/2006 11:36:00 AM

--  
好像有公式吧
--  作者:phoenixinter
--  发布时间:6/19/2006 6:57:00 PM

--  
递归的搞,很快的……Shanghai 2004 C
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms