论坛首页 Java企业应用论坛

一道算法题目,挑战自己。

浏览 13225 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-10-18  
可以定义一个数组迭代器类完成
0 请登录后投票
   发表时间:2013-10-19  
易水寒vn 写道
第一个题目,可以定义一个数组迭代器类完成
单纯for+数组,不行吧

可以的,,
0 请登录后投票
   发表时间:2013-10-19  
lvwenwen 写道
可以定义一个数组迭代器类完成

就是不想要迭代,只要for就行了。
0 请登录后投票
   发表时间:2013-10-21  
@Test
	public void test3t(){
		test3( new int[]{1, 3, 2, 5, 3 });
		test3( new int[]{3, 5, 2, 3, 1 });
		test3( new int[]{1, 1, 3, 1});
		test3( new int[]{1, 3, 1, 1 });
		test3( new int[]{1,3,5,7,9});
		test3( new int[]{1,1,3,1,5});
	}
	
	public void test3(int[] intArray){
		System.out.println(arrayToString( intArray ));
		int intOne = intArray[0];
		int intTwo = intArray[1];
		int intTree = intArray[2];
		if( (intTwo - intOne) == (intTree - intTwo)){
			if(intOne == intTwo && intTwo == intTree){
				System.out.println("无解数据,改数据的基数和自增数都是2的次方") ;
			}else{
				System.out.println("基数是 : " +( intArray[0] - intArray[1] <= 0 ?intArray[0] : intArray[intArray.length -1])   +  arrayToString(intArray)) ;
			}
			return;
		}
		/**
		 * 判断,判断是等差自增,等差自减。前提是定位好,头。。
		 * 那么需要判断这个这个数组的长度是奇数还是,偶数
		 */
		int arrayLength = intArray.length;
		int jiOu = 1;// 1是偶数,, 0是奇数
		if((arrayLength & 1)  == 0 ){
			arrayLength >>= 1;
		}else{
			if( arrayLength != 1){
				jiOu = 0;
			}
		}
		arrayLength = intArray.length;
		/**
		 * 判断是等差自增,等差自减
		 * 
		 * 同时取到 判断 基数的2个数,如果是等差加,那么 就是从开始,如果是等差减,那么从尾端取 
		 */
		boolean b = true;
		int oneShu , twoShu = 0;
		if( intArray[0] >= intArray[arrayLength-1 -jiOu]){//得到的是第一个奇数 和最后一个奇数,如果第一个 大于最后一个那么 是等差减
			oneShu = intArray[arrayLength -1]; 
			twoShu = intArray[arrayLength -2]; 
		}else{
			oneShu = intArray[0];
			twoShu = intArray[1];
			b = false;
		}
		/**
		 * 现在判断 基数 是偶数还是奇数
		 * 偶数会被2除尽,被出尽的数,小于 该偶数前一个奇数。
		 * 取出,前2个数,第一个数大于等于第二个,那么是基数为奇数,如果小于第二个数,那么是基数是偶数
		 * 
		 * 同时算出基数,
		 * 	[2 ,5 ,8 ]      [ 1,4 ,7]    [8 , 5, 2]  [ 7 ,4,   1]  
		 *         [ 1, 5,1 ]       [1, 1, 7]   [1 , 5 , 1]  [ 7 ,4,   1]
		 *        
		 *         
		 * 	1,只用在三个数,内算出奇数
		 *                (1) 如果是基数是奇数
		 *                		找到第二个奇数 - 第一个奇数 除以 2,就是基数,
		 *                (2) 如果是基数是偶数
		 * 		偶数要被2除尽,第二个偶数,比第一个奇数大, 那么是这个奇数2陪的范围内
		 *         2,只用在死个数,内算出奇数
		 *         		找到第二个奇数 - 第一个奇数 除以 2,就是基数,
		 *         
		 *         3,最后研究发现,用第一个或第二个数就可以得到了。使用最后一种方式。
		 */
		int dengCha = 0 , cha = 0;
		if(oneShu >= twoShu){//基数是奇数,换位是,用偶数的逻辑,算出基数
			dengCha = oneShu;
			oneShu = twoShu;
			twoShu = oneShu;
			cha = 1;
		}
		while( oneShu < twoShu ){
			oneShu <<=1;//经过计算后,twoShu就是基数了
		}
		dengCha = twoShu - ( oneShu =oneShu >> 1) ;
		if(oneShu == 0){
			oneShu = 1;
		}
		if(b){
			for(int i = cha ; i< arrayLength ; i = i+2){
				intArray[arrayLength -1-i] =  dengCha*i+oneShu;
			}
		}else{
			for(int i = cha ; i<arrayLength ; i = i+2){
				intArray[i] =  dengCha*i+oneShu;
			}
		}
		System.out.println(arrayToString( intArray ));
	}

 最后完整的一套代码:第四点,没有做优化。。如有不足之处,尽情的飙。

 

0 请登录后投票
   发表时间:2013-10-21   最后修改:2013-10-22
字数补齐 
0 请登录后投票
   发表时间:2013-10-21  
wifi52 写道
第二道题, 例举一个反例

如果计算规则真如同你所说的那样
[2, 4, 6, 8]
[4, 8, 12, 16]
怎样才能恢复成原先的样子?

第二道题这里有讨论了

http://www.iteye.com/topic/1056568

请你看清楚楼主写的题目。这样的数组不符合题目要求。
0 请登录后投票
   发表时间:2013-10-21  
粗略看了下。既然楼主这个帖子是从算法的角度来讲的,还有楼主想炫耀,哥们来评论下楼主的代码。
首先说第一个问题。这个问题递归是最简单的。但是单纯用for循环是写不出来的(至少不现实,你肯定不会去写一百层循环,玩笑)。
第二问题。
先说说楼主写的第一个方法。
arrayToString();
这么说吧,这个方法写下来就能看出楼主的水平了。没有贬低的意思,是经验不够。既然作为一个工具性质的方法来用,那么就得把健壮性做好。你看看这个方法的签名,先不说传null会出现什么现象,如果一个数组长度为零,你这方法马上就挂了。
其次,来说说这个代码的整洁性,第三行: sb.append('[');
第四行:return sb.append("]").toString();一会儿字符,一会儿字符串,这是想像我们表明,你会用字符,还会用字符串吗?
好吧,这个方法到此为止,接着往下。
这个测试方法,我发誓,没有人愿意仔细看。简单运行了下,没看出来什么意思。不过你那个 Random rd = new  Random();  是干什么用的?for( ; ; ),看到这里我就呵呵了。也不想在往下看了。这个方法看不懂,恐怕只有你自己才能看懂。能看的出来,楼主语法可以,但是你难道不知道有while(true);这个东西的存在吗?往下看,服了U,注释咱们能好好写吗?变量咱们能别用英文和汉语拼音一起来吗?或者你全拼音也行。

接下来说说代码效率的问题。
虽然现在对内存不做什么限制了。但是你算过你最后算法的空间复杂度吗?好了,哥去睡觉了,没准备好,千万别来这里乱彪。
0 请登录后投票
   发表时间:2013-10-21  
孤独的CPU 写道
粗略看了下。既然楼主这个帖子是从算法的角度来讲的,还有楼主想炫耀,哥们来评论下楼主的代码。
首先说第一个问题。这个问题递归是最简单的。但是单纯用for循环是写不出来的(至少不现实,你肯定不会去写一百层循环,玩笑)。
第二问题。
先说说楼主写的第一个方法。
arrayToString();
这么说吧,这个方法写下来就能看出楼主的水平了。没有贬低的意思,是经验不够。既然作为一个工具性质的方法来用,那么就得把健壮性做好。你看看这个方法的签名,先不说传null会出现什么现象,如果一个数组长度为零,你这方法马上就挂了。
其次,来说说这个代码的整洁性,第三行: sb.append('[');
第四行:return sb.append("]").toString();一会儿字符,一会儿字符串,这是想像我们表明,你会用字符,还会用字符串吗?
好吧,这个方法到此为止,接着往下。
这个测试方法,我发誓,没有人愿意仔细看。简单运行了下,没看出来什么意思。不过你那个 Random rd = new  Random();  是干什么用的?for( ; ; ),看到这里我就呵呵了。也不想在往下看了。这个方法看不懂,恐怕只有你自己才能看懂。能看的出来,楼主语法可以,但是你难道不知道有while(true);这个东西的存在吗?往下看,服了U,注释咱们能好好写吗?变量咱们能别用英文和汉语拼音一起来吗?或者你全拼音也行。

接下来说说代码效率的问题。
虽然现在对内存不做什么限制了。但是你算过你最后算法的空间复杂度吗?好了,哥去睡觉了,没准备好,千万别来这里乱彪。

呵呵,
1,arrayToString这个方法,是我偷懒,而已。如果你就因为这个说,,我只能笑笑而已。。请你看ArrayList的toString源码。
2,我英语不好我承认,这有多少关系?毕竟只是一个测试题而已。
3,空间复杂,请你说说,你说的是什么?
  还有最重要的一点,,就是,,第一道题,你做不出来, 不代表,别人做不出来,,,就两个for循环,,就可以了。一个for也行,只是比较麻烦而已。

   你说了。几点,能说了几个问题吗?,我感觉你挺有意思的。
0 请登录后投票
   发表时间:2013-10-21  
icefishc 写道
jahu 写道
jackra 写道
我去,你到底想表达神马?

有一点是,小小的炫耀。
有,是看看,,有几个人能做出来。。是不是只会百度,谷歌。
有,是想知道,算法世界有多大。


大一的? 学得满快的。 可以同学中炫耀一下。

像我这种到大三的专业课才学会的懒人膜拜大牛。 

不好意思,,我工作3年多了。。。。你那么厉害,请用for解决第一道题目
0 请登录后投票
   发表时间:2013-10-22  
jahu 写道
孤独的CPU 写道
粗略看了下。既然楼主这个帖子是从算法的角度来讲的,还有楼主想炫耀,哥们来评论下楼主的代码。
首先说第一个问题。这个问题递归是最简单的。但是单纯用for循环是写不出来的(至少不现实,你肯定不会去写一百层循环,玩笑)。
第二问题。
先说说楼主写的第一个方法。
arrayToString();
这么说吧,这个方法写下来就能看出楼主的水平了。没有贬低的意思,是经验不够。既然作为一个工具性质的方法来用,那么就得把健壮性做好。你看看这个方法的签名,先不说传null会出现什么现象,如果一个数组长度为零,你这方法马上就挂了。
其次,来说说这个代码的整洁性,第三行: sb.append('[');
第四行:return sb.append("]").toString();一会儿字符,一会儿字符串,这是想像我们表明,你会用字符,还会用字符串吗?
好吧,这个方法到此为止,接着往下。
这个测试方法,我发誓,没有人愿意仔细看。简单运行了下,没看出来什么意思。不过你那个 Random rd = new  Random();  是干什么用的?for( ; ; ),看到这里我就呵呵了。也不想在往下看了。这个方法看不懂,恐怕只有你自己才能看懂。能看的出来,楼主语法可以,但是你难道不知道有while(true);这个东西的存在吗?往下看,服了U,注释咱们能好好写吗?变量咱们能别用英文和汉语拼音一起来吗?或者你全拼音也行。

接下来说说代码效率的问题。
虽然现在对内存不做什么限制了。但是你算过你最后算法的空间复杂度吗?好了,哥去睡觉了,没准备好,千万别来这里乱彪。

呵呵,
1,arrayToString这个方法,是我偷懒,而已。如果你就因为这个说,,我只能笑笑而已。。请你看ArrayList的toString源码。
2,我英语不好我承认,这有多少关系?毕竟只是一个测试题而已。
3,空间复杂,请你说说,你说的是什么?
  还有最重要的一点,,就是,,第一道题,你做不出来, 不代表,别人做不出来,,,就两个for循环,,就可以了。一个for也行,只是比较麻烦而已。

   你说了。几点,能说了几个问题吗?,我感觉你挺有意思的。

给你一百个数组,每个数组有100个整数(随机)。麻烦你,用两个for循环给我写出来。空间复杂度不会计算?那就请你看看数据结构。我不负责培训你基本知识。还有,你键盘是不是坏了?标点符号都不会用了。木有意思,就是觉得你说话跑火车。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics