有趣的Java算法

题目及源码分析:

/*
 *  今天在BBS里面看到这样的面试题目,
1,二维数组(N*N),沿对角线方向,从右上角打印到左下角如N=4: 
4*4二维数组 	
{ 1 2 3 4 }  
{ 5 6 7 8 }  
{ 9 10 11 12 }  
{13 14 15 16 }  

打印顺序 
4  
3 8  
2 7 12  
1 6 11 16  
5 10 15  
9 14  
13  

要求半个小时内写出可完整运行的代码。
 * 
 */

/*
 * 
 算法分析:
 [0][3] 与最后一行x,y对换
 [0][2], [1][3] 与倒数第二行x,y对换
 [0][1], [1][2], [2][3] 与倒数第三行x,y对换
 [0][0], [1][1], [2][2], [3][3] 从这里下手向上下递增递减
 [1][0], [2][1], [3][2] 与第三行x,y对换
 [2][0], [3][1] 与第二行x,y对换
 [3][0] 与第一行x,y对换
 * 
 */

 

相应的事项代码:

public class Algorithm {
		
	public static void main(String[] args) {
		String split = " ";
//		int[][] arr = {{ 1, 2, 3, 4,21 },
//				{ 5, 6, 7, 8, 22},
//				{ 9, 10, 11, 12, 23},
//				{13, 14, 15, 16, 24 },
//				{17, 18, 19, 20, 25 }};
		int N = 20, value = 1;
		int[][] arr = new int[N][N];
		for (int i = 0; i < N; i++) {
			arr[i] = new int[N];
			for (int j = 0; j < N; j++) {
				arr[i][j] = value++;
			}
		}
		
		int len = arr.length - 1;
		int x = 0, y = len;
		for (int k = 0; k <= len; k++) {
			x = 0;
			for (int m = 0; m <= k; m++) {
				System.out.print(""+arr[x++][y-k+m]+split);
			}
			System.out.println(split);
		}
		
		x = y = 0;
		int n = 0;
		for (int k = len; k >= 0; k--) {
			x = n++;
			for (int m = 0; m < k; m++) {
				System.out.print(""+arr[++x][y+m]+split);
			}
			System.out.println(split);
		}
	}
}

/*
 * 
 * 当N=4时,结果为:
  	4  
	3 8  
	2 7 12  
	1 6 11 16  
	5 10 15  
	9 14  
	13  
 
         当N=5时,结果为:
    5  
	4 10  
	3 9 15  
	2 8 14 20  
	1 7 13 19 25  
	6 12 18 24  
	11 17 23  
	16 22  
	21  

	当N=20时,结果为:
	20  
	19 40  
	18 39 60  
	17 38 59 80  
	16 37 58 79 100  
	15 36 57 78 99 120  
	14 35 56 77 98 119 140  
	13 34 55 76 97 118 139 160  
	12 33 54 75 96 117 138 159 180  
	11 32 53 74 95 116 137 158 179 200  
	10 31 52 73 94 115 136 157 178 199 220  
	9 30 51 72 93 114 135 156 177 198 219 240  
	8 29 50 71 92 113 134 155 176 197 218 239 260  
	7 28 49 70 91 112 133 154 175 196 217 238 259 280  
	6 27 48 69 90 111 132 153 174 195 216 237 258 279 300  
	5 26 47 68 89 110 131 152 173 194 215 236 257 278 299 320  
	4 25 46 67 88 109 130 151 172 193 214 235 256 277 298 319 340  
	3 24 45 66 87 108 129 150 171 192 213 234 255 276 297 318 339 360  
	2 23 44 65 86 107 128 149 170 191 212 233 254 275 296 317 338 359 380  
	1 22 43 64 85 106 127 148 169 190 211 232 253 274 295 316 337 358 379 400  
	21 42 63 84 105 126 147 168 189 210 231 252 273 294 315 336 357 378 399  
	41 62 83 104 125 146 167 188 209 230 251 272 293 314 335 356 377 398  
	61 82 103 124 145 166 187 208 229 250 271 292 313 334 355 376 397  
	81 102 123 144 165 186 207 228 249 270 291 312 333 354 375 396  
	101 122 143 164 185 206 227 248 269 290 311 332 353 374 395  
	121 142 163 184 205 226 247 268 289 310 331 352 373 394  
	141 162 183 204 225 246 267 288 309 330 351 372 393  
	161 182 203 224 245 266 287 308 329 350 371 392  
	181 202 223 244 265 286 307 328 349 370 391  
	201 222 243 264 285 306 327 348 369 390  
	221 242 263 284 305 326 347 368 389  
	241 262 283 304 325 346 367 388  
	261 282 303 324 345 366 387  
	281 302 323 344 365 386  
	301 322 343 364 385  
	321 342 363 384  
	341 362 383  
	361 382  
	381  
 
	等等,依次类推,只需要改的N的值,就能自动的达到正确的结果!~
	
 * 
 * 
 * 
 */

       如果不是第一次接触这类型的题,半个小时还是有点太紧了,一个小时左右还是可以的!~我第一次看到这个题,用了一个小时!!~

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值