- 浏览: 212266 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yangdefeng95802:
也不换个行,这个谁爱看,估计你自己都不爱看!
CXF2.0.8+Spring+Hibernate -
l1i2n3y4u5n6:
你没有解惑,让我很迷惑
Apache2.2和tomcat集成更加简单了 -
micropang:
LJ
CXF2.0.8+Spring+Hibernate -
mayufenga1:
更本没说明白
Apache2.2和tomcat集成更加简单了 -
highriver:
什么公司,这样的人性。
Learning Day
看到JavaEye上的几个人在讨论算法问题,其中一个就是Google的一个面试题,我也试了一下,而且可能比一般人试得程度更深一些,借这个题目简单的说说几个性能问题。这个是第一个,后面还会继续几个其它的讨论。讨论只是提点一下,主要还是要你自己读源代码并比较不同的实现为什么会有这么大的差别。
注意,程序的运行结果是在JDK1.4.2上的,其它版本的JDK的运行结果可能稍有不同。
先看代码:
public class GoogleFn {
private static int MAX = 13200000;
private static int count1(int number) {
int result = 0;
String target = number + "";
int index = target.indexOf("1");
while (index >= 0) {
result++;
index = target.indexOf("1", index + 1);
}
return result;
}
private static void method2() {
long start = System.currentTimeMillis();
int result = 0;
for (int i = 1; i < MAX; i++) {
result += count2(i);
if (result == i) {
System.out.println("Find " + i + ", " + (System.currentTimeMillis() - start) + "ms");
}
}
}
public static void main(String[] args) {
method1();
method2();
}
}
运行结果是:
Find 1, 16ms
Find 199981, 219ms
Find 199982, 219ms
Find 199983, 219ms
Find 199984, 219ms
Find 199985, 219ms
Find 199986, 219ms
Find 199987, 219ms
Find 199988, 219ms
Find 199989, 219ms
Find 199990, 219ms
Find 200000, 219ms
Find 200001, 219ms
Find 1599981, 1516ms
Find 1599982, 1516ms
Find 1599983, 1516ms
Find 1599984, 1516ms
Find 1599985, 1516ms
Find 1599986, 1516ms
Find 1599987, 1516ms
Find 1599988, 1516ms
Find 1599989, 1516ms
Find 1599990, 1516ms
Find 2600000, 2469ms
Find 2600001, 2469ms
Find 13199998, 12594ms
Find 1, 0ms
Find 199981, 47ms
Find 199982, 47ms
Find 199983, 47ms
Find 199984, 47ms
Find 199985, 47ms
Find 199986, 47ms
Find 199987, 47ms
Find 199988, 47ms
Find 199989, 47ms
Find 199990, 47ms
Find 200000, 47ms
Find 200001, 47ms
Find 1599981, 453ms
Find 1599982, 453ms
Find 1599983, 453ms
Find 1599984, 453ms
Find 1599985, 453ms
Find 1599986, 453ms
Find 1599987, 453ms
Find 1599988, 453ms
Find 1599989, 453ms
Find 1599990, 453ms
Find 2600000, 765ms
Find 2600001, 765ms
Find 13199998, 4187ms
我们以最后一个找到的数字为例,前者的时间是后者的3倍,代码的其它部分完全一样,区别就是前者是转换为字符串查找1的个数,后者使用数学的取模运算计算。
评论
if num =0 return 0
if 0<num<10 return 1
if num startWith 1 return f(10^(len(num)-1)-1)+num(去掉最高位数字)+1+f(num(去掉最高位数字))
else
10^(len(num)-1) + num(去掉最高位数字)* cal(10^(len(num)-1)-1) + f(num(去掉最高位数字));
public static void main(String[] args) { // TODO Auto-generated method stub long start = System.currentTimeMillis(); Integer num = 535200001; int a = cal(num); System.out.println("TIME = " + (System.currentTimeMillis()-start));; } public static int cal(Integer num) { int a = 0; System.out.println(num); if (num == 0) a = 0; else if (num >=1 &&num <= 9) a = 1; else if ((num.toString()).startsWith("1")) { int b1 = index(10,String.valueOf(num).length() - 1) - 1; int b2 = Integer.parseInt(num.toString().substring(1)); a = cal(b1) + b2 + 1 + cal(b2); } else { int b1 = index(10,String.valueOf(num).length() - 1) - 1; int b2 = Integer.parseInt(num.toString().substring(1)); int b3 = Integer.parseInt(num.toString().substring(0,1)); a = index(10,String.valueOf(num).length()-1) + b3 * cal(b1) + cal(b2); } return a; } public static int index(int number, int size) { int num = 1; for (int i=0;i<size;i++) { num = num * number; } return num; }
Find 1, 0ms
Find 199981, 78ms
Find 199982, 78ms
Find 199983, 78ms
Find 199984, 78ms
Find 199985, 78ms
Find 199986, 78ms
Find 199987, 78ms
Find 199988, 78ms
Find 199989, 78ms
Find 199990, 78ms
Find 200000, 78ms
Find 200001, 78ms
Find 1599981, 438ms
Find 1599982, 438ms
Find 1599983, 438ms
Find 1599984, 438ms
Find 1599985, 438ms
Find 1599986, 438ms
Find 1599987, 438ms
Find 1599988, 438ms
Find 1599989, 438ms
Find 1599990, 438ms
Find 2600000, 719ms
Find 2600001, 719ms
Find 13199998, 3813ms
Find 1, 0ms
Find 199981, 47ms
Find 199982, 47ms
Find 199983, 47ms
Find 199984, 47ms
Find 199985, 47ms
Find 199986, 47ms
Find 199987, 47ms
Find 199988, 47ms
Find 199989, 47ms
Find 199990, 47ms
Find 200000, 47ms
Find 200001, 47ms
Find 1599981, 406ms
Find 1599982, 406ms
Find 1599983, 406ms
Find 1599984, 406ms
Find 1599985, 406ms
Find 1599986, 406ms
Find 1599987, 406ms
Find 1599988, 406ms
Find 1599989, 406ms
Find 1599990, 406ms
Find 2600000, 703ms
Find 2600001, 703ms
Find 13199998, 3890ms
使用String.valueOf(number);
Find 1, 0ms
Find 199981, 47ms
Find 199982, 47ms
Find 199983, 47ms
Find 199984, 47ms
Find 199985, 47ms
Find 199986, 47ms
Find 199987, 47ms
Find 199988, 47ms
Find 199989, 47ms
Find 199990, 47ms
Find 200000, 47ms
Find 200001, 47ms
Find 1599981, 281ms
Find 1599982, 281ms
Find 1599983, 281ms
Find 1599984, 281ms
Find 1599985, 281ms
Find 1599986, 281ms
Find 1599987, 281ms
Find 1599988, 281ms
Find 1599989, 281ms
Find 1599990, 281ms
Find 2600000, 453ms
Find 2600001, 453ms
Find 13199998, 2453ms
Find 1, 0ms
Find 199981, 62ms
Find 199982, 62ms
Find 199983, 62ms
Find 199984, 62ms
Find 199985, 62ms
Find 199986, 62ms
Find 199987, 62ms
Find 199988, 62ms
Find 199989, 62ms
Find 199990, 62ms
Find 200000, 62ms
Find 200001, 62ms
Find 1599981, 422ms
Find 1599982, 422ms
Find 1599983, 422ms
Find 1599984, 422ms
Find 1599985, 422ms
Find 1599986, 422ms
Find 1599987, 422ms
Find 1599988, 422ms
Find 1599989, 422ms
Find 1599990, 422ms
Find 2600000, 703ms
Find 2600001, 703ms
Find 13199998, 3891ms
字符串分析更快
Find 1, 0ms
Find 199981, 63ms
Find 199982, 63ms
Find 199983, 63ms
Find 199984, 63ms
Find 199985, 63ms
Find 199986, 63ms
Find 199987, 63ms
Find 199988, 63ms
Find 199989, 63ms
Find 199990, 63ms
Find 200000, 63ms
Find 200001, 63ms
Find 1599981, 516ms
Find 1599982, 516ms
Find 1599983, 516ms
Find 1599984, 516ms
Find 1599985, 516ms
Find 1599986, 516ms
Find 1599987, 516ms
Find 1599988, 516ms
Find 1599989, 516ms
Find 1599990, 516ms
Find 2600000, 844ms
Find 2600001, 844ms
Find 13199998, 4391ms
Find 1, 0ms
Find 199981, 47ms
Find 199982, 47ms
Find 199983, 47ms
Find 199984, 47ms
Find 199985, 47ms
Find 199986, 47ms
Find 199987, 47ms
Find 199988, 47ms
Find 199989, 47ms
Find 199990, 47ms
Find 200000, 47ms
Find 200001, 47ms
Find 1599981, 297ms
Find 1599982, 297ms
Find 1599983, 297ms
Find 1599984, 297ms
Find 1599985, 297ms
Find 1599986, 297ms
Find 1599987, 297ms
Find 1599988, 297ms
Find 1599989, 297ms
Find 1599990, 297ms
Find 2600000, 484ms
Find 2600001, 484ms
Find 13199998, 2781ms
String target = number + "";
换成
String target = String.valueOf(number);
效率马上得到极大的提升。
发表评论
-
Tomcat集群概要
2007-09-05 03:59 1996其实已经有很多文档了,不过还是老话,给自己备忘,总结些要注意的 ... -
Eclipse的一个问题
2007-09-05 06:13 1308最近遇到的,偶然间解决的,如果一些文件和目录已经被Worksp ... -
Java远程调试
2007-09-05 06:47 2306其实就是使用了JDK的JPDA,在启动服务器(Jboss或者T ... -
JDK5中没被重视的重要特性:instrumentation
2007-09-05 07:42 1650我们的产品中使用到这个特性了,主要是加载Jboss的AOP,另 ... -
得到当前方法
2007-08-09 13:53 1335在写代码的时候我们可能会需要当前的方法名,特别是在输出一些调试 ... -
使用AOP带来的问题
2007-08-02 04:57 1378AOP绝对是个好东西,但是因为大部分的AOP实现都是通过修改字 ... -
推荐一个Eclipse插件:Implementors
2007-08-01 05:06 1114也许有点老土了,但是这个插件确实是刚刚别人推荐给我的,而且很好 ... -
使用JBossCache作为Hibernate的二级缓存
2007-07-23 11:36 2094这个是最近的工作成果,使用JBossCache作为Hibern ... -
URLDataSource请求资源三次的问题
2007-07-13 04:58 1459这个是进公司的第二个任务,由于是多个应用服务器集群,而产生pd ... -
JSP的一个小误区
2007-07-12 11:15 973相信很多人在面试的时候都会被问到JSP和Servlet的区别, ... -
Hot Deploy成功
2007-07-12 11:24 1340前几天曾经抱怨新公司的开发环境太复杂,不能Hot Deploy ... -
文件删除不成功
2007-07-12 11:31 1075Java的功能在某些地方确实很有缺陷,File的delete方 ... -
AR何其多
2007-07-09 13:29 1177看了新公司的发布目录,感叹公司把Java相关的发布包用得出神入 ... -
太复杂了!!!
2007-07-03 12:58 1105今天总算是把工程在Eclipse下配置好了,而且没有任何错误, ... -
links for 2007-05-12
2007-05-12 14:21 1081Lucene Hack之通过缩小搜索结果集来提升性能 (1 ... -
Java序列化确实很慢啊
2007-04-25 06:37 2052我们的系统还使用古老的Ant1.5作为构建工具,而且做了一些定 ... -
使用工具修改代码时一定要谨慎
2007-04-19 03:21 1158今天早上来更新了下代码,发现自己负责的和Crystal Rep ... -
数据库可移植性重要吗?
2007-04-18 06:30 2105对于大部分应用而言,数据库可移植性可能不太重要,而一些完全使用 ... -
没落的Java社区
2007-04-17 09:27 1513感觉原来的几个Java社区日益没落,当然这个和Java世界的消 ... -
也谈Java基础的重要性
2007-04-10 07:33 2812呵呵,看到JDon上正在讨论j2se基础的重要性,忍不住也来说 ...
相关推荐
字符串是编程语言中常见且重要的数据结构之一,尤其在面试中常常被用来考察候选人的逻辑思维和算法理解能力。以下是一些与字符串相关的面试题目及其解题思路: 1. **字符串循环左移**:给定一个字符串和一个整数k,...
面试题练习题前端 JavaScript高级语法-字符串属性面试题练习题前端 JavaScript高级语法-字符串属性面试题练习题前端 JavaScript高级语法-字符串属性面试题练习题前端 JavaScript高级语法-字符串属性面试题练习题前端...
以上解答了C语言中涉及字符串处理的一些基础面试题,实际编程中,我们需要考虑到边界条件、效率优化和错误处理等因素,确保代码的健壮性和正确性。在面试中,理解这些基本概念并能灵活运用是至关重要的。
字符串处理面试题总结 字符串处理是程序员日常工作中最常遇到的问题,能够体现程序员的基本功。下面是关于字符串处理的面试题总结: 一、求字符串的最小后继 问题:实现一个函数,输入一个字符串,输出该字符串的...
本文将基于提供的内容,深入解析两个字符串处理问题,一个是求给定字符串的最小后继,另一个是实现字符串的右移操作。 首先,我们来看第一个问题:求给定字符串的最小后继。这个问题主要考察的是对字符编码的理解和...
1.字符串高频面试题精讲1.字符串高频面试题精讲1.字符串高频面试题精讲
在C/C++编程语言中,字符串处理是一个非常基础且重要的知识点。C/C++语言本身并没有专门的字符串变量类型,而是使用字符数组来存放字符串,其中字符串的结束符是“\0”(空字符)。掌握字符与数字之间的转换对于进行...
11. 最长数字串:该题目要求编写一个函数,输出字符串中最长的数字串,考察了候选人的字符串处理能力和算法设计能力。 知识点:字符串处理、数字串识别、动态规划。 12. 字符串左旋转:该题目要求编写一个函数,...
综上所述,解决“C语言面试题之哈希表字符串中的第一个唯一字符”不仅要求掌握C语言的基础语法,还需理解哈希表的原理和应用,以及具备良好的算法设计和分析能力。熟练掌握这些知识点,对于提升C语言编程技能和应对...
面试题20:表示数值的字符串 面试题21:调整数组顺序使奇数位于偶数前面 面试题22:链表中倒数第k个节点 面试题23:链表中环的入口节点 面试题24:反转链表 面试题25:合并两个排序的链表 面试题26:树的子结构 面试...
本资源"《C语言字符串练习(习题+答案).zip》"正是针对这一需求而准备的,它包含了C语言字符串操作的专项练习题和对应的答案,帮助学习者巩固和提升在字符串处理方面的技能。 字符串在C语言中扮演着重要角色,它们...
在C++编程中,字符串处理是面试中常见的知识点,尤其是涉及到内存操作的部分。本文将深入探讨`memset`、`strcpy`、`memcpy`以及`memmove`这四个函数的使用和区别。 首先,`memset`函数用于填充内存。它的原型是`...
标题中的“Code_笔试题_字符串压缩_”指的是一个与编程相关的笔试题目,重点在于实现字符串的压缩功能。这类问题通常出现在技术面试或招聘过程的笔试试题中,旨在考察应聘者的编程能力和对数据结构的理解。 描述中...
在这个"反转字符串"的面试题中,我们将深入探讨如何使用双指针来实现这一任务。 首先,我们需要了解C语言中字符串的基本概念。在C语言中,字符串是由零个或多个字符组成的序列,以空字符'\0'作为结束标志。我们通常...
首先,字符串反转是编程中常见的问题,常常用于各类笔试和面试中。而字符串逆序则是在反转的基础上,进一步处理,让整个字符串的顺序完全颠倒。 在本知识点中,将详细介绍以下内容: 1. 字符串反转的原理和方法 2. ...
在程序员的面试中,字符串操作是一项常见的考察点。本题目的核心是输出一个给定字符串的所有子串,这里我们以字符串 "abc" 为例来详细讲解解题思路和方法。 首先,我们需要理解子字符串的概念。在字符串 "abc" 中,...
根据提供的文件信息,我们可以从中提炼出与字符串反转相关的知识点,具体包括以下方面: ### 字符串反转的方法 #### 方法一:使用字符数组实现反转 在第一个示例代码中,使用了字符数组来实现字符串的反转。 ```...
7. **字符串处理问题**:如模式匹配、字符串反转等。 8. **数学问题**:涉及数学运算和逻辑的算法问题。 解决算法题通常需要对问题进行分析,选择合适的算法或数据结构,并编写出高效、清晰的代码。在面试、编程...
【字符串包含问题】是计算机科学中常见的字符串处理问题,主要关注如何高效地判断一个较短的字符串(子串)是否完全包含在另一个较长的字符串(主串)中。以下是几种解决此类问题的方法: ### 第一节:基础方法 1....