摘要: 题目:调整一数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。方案一:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。分析:由于碰到一个偶数,需要移动O(n)个数字,因此总的时间复杂度是O(n*n)。方案二:要求的是把奇数放在数组的前半部分,偶数放在数组的后半部分,因此所有的奇数应该位于偶数的前面。也就是说我们在扫描这个数组的时候,如果发现有偶数出现在奇数的前面,我们可以交换他们的顺序,交换之后就符合要求了。 因此我... 阅读全文
posted @ 2013-09-22 15:29 欧麦高德 阅读(419) 评论(0) 推荐(1)
摘要: 1:使用SHOW语句找出在服务器上当前存在什么数据库:mysql> SHOW DATABASES;2:创建一个数据库MYSQLDATAmysql> CREATE DATABASE MYSQLDATA;3:选择你所创建的数据库mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)4:查看现在的数据库中存在什么表mysql> SHOW TABLES;5:创建一个数据库表mysql> CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));6:显示表的结构:mysq 阅读全文
posted @ 2013-09-21 19:04 欧麦高德 阅读(279) 评论(0) 推荐(0)
摘要: 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。示例:输入”They are students.”和”aeiou”, 输出 ”Thy r stdnts.”。方案一:在第一个字符串中拿到一个字符,在第二个字符串中查找一下,看它是不是在第二个字符串中。如果在的话,就从第一个字符串中删除。分析:由于字符串的内存分配方式是连续分配的。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个字节的位置。但如果每次删除都需要移动字符串后面的字符的话,对于一个长度为n的字符串而言,删除一个字符的时间复杂度为O(n)。而对于本题而言,有可能要删除的字符的个数是n,因此该方法就删除... 阅读全文
posted @ 2013-09-21 15:28 欧麦高德 阅读(954) 评论(0) 推荐(0)
摘要: 思想:将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的右半部继续搜索x。分析:它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(logn)完成搜索任务。代码:public static boolean find(int n, int[] a, int start, int end) { if (start > end) return false; int mid = (start + end) / 2; if (n == a[mid]) return true;... 阅读全文
posted @ 2013-09-17 20:10 欧麦高德 阅读(217) 评论(0) 推荐(0)
摘要: 题目:一个数组中的元素,只有一个数字出现了一次,其他的元素都出现两次。找出出现一次的这个数字。示例: {1,2,1,3,2,4,4} 输出:3方案1:先将数组进行排序,这个数字一定是出现在第奇数位上(从1开始计数),并且这个数和后面的数不相同。 若没有找到这个数字,则其为排序后的最后一个数字。分析:进行排序的时间复杂度O(nlogn),再遍历一遍为O(n),则总体时间复杂度为O(nlogn)。方案2*:若数组中不含有0和1,可令sum= a[0]*a[1]*...*a[n-1]。 然后再遍历一遍数组,看a[i]是否能整除sum两次,若不能,即为所求。分析:为求得sum,需要遍历... 阅读全文
posted @ 2013-09-16 19:15 欧麦高德 阅读(384) 评论(1) 推荐(0)
摘要: 题目:假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。 判断是否所有小字符串里的字母在大字符串里都有?示例1 :String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPOM输出true示例2:String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPOZ输出false方案1:轮询第二个字符串里的每个字母,看它是否同在第一个字符串里。从算法上讲,这需要O(n*m)次操作。方案2:先对这两个字符串的字母进行排序,然后同时对两个字串依次轮询。两个字串的排序需要(常规情况)O(m log... 阅读全文
posted @ 2013-09-15 20:25 欧麦高德 阅读(312) 评论(0) 推荐(0)
摘要: (注:本题是2题的完善)题目:判断集合S之中是否存在两个数之和为指定大小N示例:集合S={1,5,3,7,9,3,2,8} N=10 输出:yes方案1:集合是无序的,那么我们必须将各种两两组合的数相加,来判断,这样的时间复杂度为O(n*n)。方案2:倘若集合是有序的,我们能不能利用有序这个条件呢? 1 我们可以使用一种平均性能不错的排序,先将集合进行排序,O(nlogn)。 2 从前向后逐一遍历集合,若当前元素s[i] = i,有因为集合也是有序的,可以用二分查找来找N-i是否存在。 2.1 若存在,则输出yes 2.2 否则,继续向后... 阅读全文
posted @ 2013-09-15 20:05 欧麦高德 阅读(299) 评论(0) 推荐(0)
摘要: 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。优点:1 在内存中只有一个对象,节省内存空间。2 避免频繁的创建销毁对象,可以提高性能。3 避免对共享资源的多重占用。4 可以全局访问。要素:1 私有的构造方法2 指向自己实例的私有静态引用3 以自己实例为返回值的静态的公有的方法实现:单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例。饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。代码:饿汉式单例public class Singleton { private static S... 阅读全文
posted @ 2013-08-27 08:50 欧麦高德 阅读(260) 评论(0) 推荐(0)
摘要: 题目:输出一个正整数的二进制中1的个数。示例:10(二进制为1010),则输出2方案一:基本思想:使用除法,不断除以2,记录余数为1时的次数。代码:while(i!=0){ if(i%2!=0) num++; i = i/2; }方案二:基本思想:使用位运算(效率上高于方案一),通过不断的右移,记录最右位为1的次数。代码:while(i!=0){ if((i&1)!=0) //最后一位为1 num++; i = i>>1; }注意:若输入为负数的时候,会导致死循环。方案三:基本思想:一个数的二进制减去1之后,会发生这样的改变:从最右边的... 阅读全文
posted @ 2013-08-25 17:23 欧麦高德 阅读(267) 评论(0) 推荐(0)
摘要: 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。示例 int[] a = {1,2,4,2,3,2,5,2,2} 输出:2方案1:若是数组为排好序的,则中间位置的那个数,一定是为所求。所以可以先将数组排序,然后直接输出中间的那个数。平均的排序时间为O(nlogn)。方案2:不排序,依次统计每一元素的次数,使用哈希表。时间为遍历一次数组的时间加上遍历一次哈希表,找到其中最大的次数的时间。并且,哈希表还要占用一定的空间。方案3:我们应该注意到,要找的数字出现的次数比其他所有数字出现次数的和还要多。因此在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数。当我们遍历到下 阅读全文
posted @ 2013-08-08 17:08 欧麦高德 阅读(325) 评论(0) 推荐(0)