英雄会之在线笔试面试
原题地址: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;
}
}

浙公网安备 33010602011771号