最近面试时候碰到的算法题目,自己写一下,顺便和大家交流下groovy的语法糖...

题目都比较简单——用什么语言写,都不是重点——笔试中我都是狂省略式写法的

 

   1.上周五面试时候要写一个生产者消费者的例子——网上一堆的,我用Groovy写一个

 

 

import java.util.concurrent.*

def q = new ArrayBlockingQueue(10)

// Productor
Thread.start{
	10.times{
		q << new Random().nextInt(100)
		sleep(1000 * 3)
	}
}

// Consumer
Thread.start{
	8.times{
		def obj = q.take()
		println obj?:'Nothing keep waiting.'
		sleep(1000 * 2)
	}
}

 

2. 有一个整数数组,其中除了0,其他的数字均不重复,写一个程序,随即取出5个数字,并判断该5个数字是否相邻,其中0可以变成任何整数。

 

 

def is_adj = {arr ->
	def r = new Random()
	def ll = []
	5.times{
		ll << arr[r.nextInt(arr.size())]
	}

	ll = ll.unique() - [0]
	return ll.max() - ll.min() < 5
}

def arr = (10..25) + (1..5).collect{0}
println is_adj(arr)

 

3. 给一个字符串(只有字母),写个方法返回字符串,使得每一个字母按照下列变化规则——

 

   A-Z B-Y...Z-A a-z...z-a

 

def transf(String str){
	return str.collect{
		(char)((int)it >= 97 ? (97*2-(int)it+25) : (65*2-(int)it+25))
	}.join('')
}
println transf('ABCcba')

 

 

4. 还有在je上发现的——http://www.iteye.com/topic/545378

 

一个画图程序 要求打印出 

Java代码 
  1. int i=5;  
  2. 1  2  3  4  5  
  3. 16 17 18 19 6  
  4. 15 24 25 20 7  
  5. 14 23 22 21 8  
  6. 13 12 11 10 9  
  7.   
  8. int i=6  
  9. 1  2  3  4  5   6  
  10. 20 21 22 23 24  7  
  11. 19 32 33 34 25  8  
  12. 18 31 36 35 26  9  
  13. 17 30 29 28 27 10  
  14. 16 15 14 13 12 11  

 

 

 

def set = {num, matrix, len, left ->
	int begin = 0 // 这一圈的开始补值
	if(left){
		(1..left).each{
			begin += (len + it * 2 - 1) * 4
		}
	}

	if(num <= len) // 顶行
		matrix[0 + left][num + left - 1] = begin + num
	else if(num < len * 2) // 右列
		matrix[num-len+left][len-1+left] = begin + num 
	else if(num < len * 3 - 1) // 底行
		matrix[len-1+left][len * 3 - 2 - num + left] = begin + num
	else // 左列
		matrix[len-1-(num-3*len+2)+left][0+left] = begin + num
}

int n = 25
int[][] matrix = new int[n][n]
int left = 0 // 一圈一圈的,表示第几圈
for(int k = n; k > 0; k = k - 2){
	(1..4*(k-1)).each{set(it, matrix, k, left)} // 分别把数填进去
	left++
}

matrix.each{
	println it
}
 

如果哪位童鞋最近找工作,笔试中有什么算法题,可以分享出来呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值