一个算法题,面试中遇到,求大神指点

空城空忆亦空心 2018-07-06 06:47:27

如图,指定一个元素,比如2,遍历出与这个元素相等并且相邻的元素,如果有符合的,则继续再遍历,打印出符合元素的坐标,图中绿色部分
用JAVA语言写
...全文
201 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
天行归来 2018-07-07
  • 打赏
  • 举报
回复
1、遍历二维数组,查找节点X是否等于指定值
2、指定值节点X上下左右是否有匹配值,如果有,则X是符合条件的节点。
需要注意的是,在找节点上下左右(刨除自身),不可超出二维数组范畴。

以下是算法,非矩阵二维数组也适用。

private static boolean isMatched(int [][]data, int row, int col, int v){
for(int i=-1; i<=1; i++){
for (int j=-1; j<=1; j++){
//如果非紧挨节点,则不符合
if (Math.abs(i+j)!=1) continue;
//是否超出二维数据范围
if ((row+i)<0 || ((row+i)>=data.length) || (col+j)<0 || (col+j)>=data[row+i].length) continue;
if (data[row+i][col+j]==v){
return true;
}
}
}
return false;
}

public static void main(String[]args){
int [][] data = {{2,4,2,3,4},{3,2,2,5,7},{4,2,5,6,8},{2,2,2,2,6},{2,3,4,2,2}};
for(int i=0; i<data.length; i++){
for (int j=0; j<data[i].length; j++){
if (data[i][j]==2){
if (isMatched(data, i, j, 2)) System.out.println(String.format("%d,%d",i,j));
}
}
}
}
亲爱的Joe 2018-07-07
  • 打赏
  • 举报
回复
凑个热闹,现个丑。求打脸。。


private static void doFunction(int[][] datas, int conditionsNum) {
int length = datas.length;
//按照上下左右的顺序判断
for (int x = 0; x < 5; x++) {
for (int y = 0; y < length; y++) {
if(datas[x][y]==conditionsNum){
System.out.println(String.format("\n********本值%d--本值坐标(%d,%d)*******", datas[x][y], x, y));
//判断上
if (x - 1 >= 0 && datas[x - 1][y] == conditionsNum ) {
System.out.println(String.format("位于本值上方 坐标 (%d,%d),值为 %d", x - 1, y, datas[x - 1][y]));
}
//判断下
if (x + 1 < length && datas[x + 1][y] == conditionsNum ) {
System.out.println(String.format("位于本值下方 坐标 (%d,%d),值为 %d", x + 1, y, datas[x + 1][y]));
}
//判断左
if (y - 1 >= 0 && datas[x][y - 1] == conditionsNum ) {
System.out.println(String.format("位于本值左方 坐标 (%d,%d),值为 %d", x, y - 1, datas[x][y - 1]));
}
//判断右
if (y + 1 < 5 && datas[x][y + 1] == conditionsNum ) {
System.out.println(String.format("位于本值右方 坐标 (%d,%d),值为 %d", x, y + 1, datas[x][y + 1]));
}
System.out.println("***********************************\n");
}
}
}
}

调用:

int conditionsNum = 2;
doFunction(datas, conditionsNum);
  • 打赏
  • 举报
回复
引用 1 楼 frank_lee_cn 的回复:
你怎么思考的?
我自己是一直思考着用递归。分上右下左四个方向
  • 打赏
  • 举报
回复
引用 2 楼 lynmison 的回复:
1、遍历二维数组,查找节点X是否等于指定值
2、指定值节点X上下左右是否有匹配值,如果有,则X是符合条件的节点。
需要注意的是,在找节点上下左右(刨除自身),不可超出二维数组范畴。

以下是算法,非矩阵二维数组也适用。

private static boolean isMatched(int [][]data, int row, int col, int v){
for(int i=-1; i<=1; i++){
for (int j=-1; j<=1; j++){
//如果非紧挨节点,则不符合
if (Math.abs(i+j)!=1) continue;
//是否超出二维数据范围
if ((row+i)<0 || ((row+i)>=data.length) || (col+j)<0 || (col+j)>=data[row+i].length) continue;
if (data[row+i][col+j]==v){
return true;
}
}
}
return false;
}

public static void main(String[]args){
int [][] data = {{2,4,2,3,4},{3,2,2,5,7},{4,2,5,6,8},{2,2,2,2,6},{2,3,4,2,2}};
for(int i=0; i<data.length; i++){
for (int j=0; j<data[i].length; j++){
if (data[i][j]==2){
if (isMatched(data, i, j, 2)) System.out.println(String.format("%d,%d",i,j));
}
}
}
}
谢谢您的回复,我拿你的代码测试过,针对图中的数组来说是正确的,但是如果把下标为(1,1)的值改为3,则输出结果就不对了,下标为(0,2)和(1,2)就不符合了,因为题目要求是要从指定元素周围相邻且相等,这是我的想法,不知道有没有看错您的代码
天行归来 2018-07-07
  • 打赏
  • 举报
回复
引用 3 楼 qq_40702317 的回复:
[quote=引用 2 楼 lynmison 的回复:]
1、遍历二维数组,查找节点X是否等于指定值
2、指定值节点X上下左右是否有匹配值,如果有,则X是符合条件的节点。
需要注意的是,在找节点上下左右(刨除自身),不可超出二维数组范畴。

以下是算法,非矩阵二维数组也适用。

private static boolean isMatched(int [][]data, int row, int col, int v){
for(int i=-1; i<=1; i++){
for (int j=-1; j<=1; j++){
//如果非紧挨节点,则不符合
if (Math.abs(i+j)!=1) continue;
//是否超出二维数据范围
if ((row+i)<0 || ((row+i)>=data.length) || (col+j)<0 || (col+j)>=data[row+i].length) continue;
if (data[row+i][col+j]==v){
return true;
}
}
}
return false;
}

public static void main(String[]args){
int [][] data = {{2,4,2,3,4},{3,2,2,5,7},{4,2,5,6,8},{2,2,2,2,6},{2,3,4,2,2}};
for(int i=0; i<data.length; i++){
for (int j=0; j<data[i].length; j++){
if (data[i][j]==2){
if (isMatched(data, i, j, 2)) System.out.println(String.format("%d,%d",i,j));
}
}
}
}
谢谢您的回复,我拿你的代码测试过,针对图中的数组来说是正确的,但是如果把下标为(1,1)的值改为3,则输出结果就不对了,下标为(0,2)和(1,2)就不符合了,因为题目要求是要从指定元素周围相邻且相等,这是我的想法,不知道有没有看错您的代码[/quote]

按你意思是每个点边上必须要有两个相邻
判断条件加下改进下就可以。


private static boolean findMatched(int [][]data, int row, int col, int v, Map<Integer, Object> rets){
int n = 0;
rets.clear();
for(int i=-1; i<=1; i++){
for (int j=-1; j<=1; j++){
//如果非紧挨节点,则不符合
if (Math.abs(i+j)!=1) continue;
//是否超出二维数据范围
if ((row+i)<0 || ((row+i)>=data.length) || (col+j)<0 || (col+j)>=data[row+i].length) continue;
if (data[row+i][col+j]==v){
n++;
rets.put((row+i)*5+col+j,String.format("{%d,%d}", row+i,col+j));
}
}
}

return n>=2;
}

public static void main(String[]args){
int [][] data = {{2,4,2,3,4},{3,3,2,5,7},{4,2,5,6,8},{2,2,2,2,6},{2,3,4,2,2}};
Map<Integer, Object> rets = new HashMap<Integer, Object>();
Map<Integer, Object> tmp = new HashMap<Integer, Object>();
for(int i=0; i<data.length; i++){
for (int j=0; j<data[i].length; j++){
if (data[i][j]==2){
if (findMatched(data, i, j, 2, tmp)){
for (Integer in : tmp.keySet()) rets.put(in, tmp.get(in));
}
}
}
}
for (Integer in : rets.keySet()) System.out.println(in+"=>"+rets.get(in));
}

输出

17=>{3,2}
16=>{3,1}
18=>{3,3}
20=>{4,0}
23=>{4,3}
24=>{4,4}
11=>{2,1}
15=>{3,0}
Frank6600 2018-07-06
  • 打赏
  • 举报
回复
你怎么思考的?

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧