英雄会之在线笔试面试

原题地址:http://bbs.csdn.net/topics/390398519

第一题、杨氏矩阵查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
    例如下面的二维数组就是每行、每列都递增排序,如果在这个数组中查找数字6,则返回True;如果查找数字10,由于数组不含有该数字,则返回False。
1 2 3
4 5 6
7 8 9
 
输入:
输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如上描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
输出:
对应每个测试案例,
输出”True”代表在二维数组中找到了数字t。
输出”False”代表在二维数组中没有找到数字t。
 
输入样例:
3 3
1
2 3 4
5 6 7
8 9 10
输出样例:
False

在线提交代码地址:http://hero.pongo.cn/Question/Details?ID=18&ExamID=18

根据参与者提交代码的优劣,选出一名胜出者,特奖励最新程序员杂志一本,本人颁奖,为期30天,2013-04-19截止,欢迎大家尽情享受在线编程与思考的乐趣,感谢。
July、二零一二年三月二十日。



-----------------------------------------

下面是我写的代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws NumberFormatException 
	 */
	public static void main(String[] args) throws NumberFormatException, IOException {
		int r = 0 ;
		int c = 0 ;
		int number = 0; 
		System.out.print("请输入二维数组的行数:");
		BufferedReader strin=new BufferedReader(new InputStreamReader(System.in));
		r=Integer.parseInt(strin.readLine());
		System.out.print("请输入二维数组的列数:");
		strin=new BufferedReader(new InputStreamReader(System.in));
		c=Integer.parseInt(strin.readLine());
		int [][] a = getArray(r,c);  
		for (int i = 0; i < a.length; i++) {
			int [] b = a[i]; 
			for (int j = 0; j < b.length; j++) {
				System.out.print(b[j] + " ");
			}
			System.out.println(); 
		}
		System.out.print("请输入要查找的数:");
		strin=new BufferedReader(new InputStreamReader(System.in));
		number = Integer.parseInt(strin.readLine());
		System.out.println(exists(a,number));
		System.out.println();
	}

	/**
	 * 生成二维数组并行,列递增排序
	 * @param r 行数
	 * @param c 列数
	 * @return 
	 */
	public static int[][] getArray(int r,int c){
		int[][] arr = new int[r][c];
		int k = 0;
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				arr[i][j] = c+k;
				k++;
			}
		}
		return arr;
	}

	/**
	 * 判断数字是否存在二维数组中
	 * @param arr 二维数组
	 * @param number 是否存在的数值
	 * @return
	 */
	public static boolean exists(int[][] arr,int number){
		for (int[] is : arr) {
			if(search(is, number)){
				return true;
			}
		}
		return false;
	}

	/** 
	 *  二分查找算法 
	 * @param array 有序数组 
	 * @param number 查找元素  
	 * @return 
	 */   
	public static boolean search(int[] array, int number){   
		int low = 0;   
		int high = array.length-1;   
		while(low <= high) {     
			int middle = (low + high)/2;   
			if(number == array[middle]) {   
				return true;   
			}else if(number <array[middle]) {   
				high = middle - 1;   
			}else {       
				low = middle + 1;   
			}  
		}    
		return false;  
	} 
}


posted @ 2013-03-20 08:00  java程序员填空  阅读(167)  评论(0编辑  收藏  举报