年终了,平平淡淡的一年。经历了裸辞带着不到1年的工作经验投入首都的怀抱,苦苦寻求工作无果后落脚在一家外包公司,就在我开始怀疑编程打代码到底是我谋生的技能还是我喜欢的东西的时,甲方给了我一次惊喜,他们提了一个类似于最近比较流行于各大APP的收徒的需求,公司分为管理职级和非管理职级,当非管理职级的员工收徒达到一定数量时,就会晋升为管理职级,并把他徒弟以及徒子徒孙们一并带走成为他的下属员工。
这让我想起了树的数据结构,所有员工建立的这种师徒关系就是一片森林,只要找到即将晋升的结点,把他的子结点遍历出来就是他需要带走的员工。这是我从业两年来在浩瀚无垠的增删改查的一束光,即使这是很简单的数据结构,但这是我在实际开发工作中第一次数据结构与业务场景的结合,此时我发现编程并不只是我谋生的工具,同时也热爱着编程并沉浸于编程,当我将这部代码开发完成,测试完成后那一刻的心情仿佛我用平A抢了大龙一样激动。于是我决定不该这样安于现状,要重新寻回编程的快乐。
我将用java和python两种语言刷一遍剑指Offer,java算是我的第一编程语言,python则是最近想入门的。
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
由于矩阵从左到右,从上到下都呈递增排列,可以选取左下和右上两个点作为基点与目标元素比较大小,决定下标移动的方向
java:
public boolean Find(int target, int [][] array) {
//边界校验
if(array.length == 0 || array[0].length == 0){
return false;
}
//选择起点(左下/右上)
int x = 0; // int x = array.length-1;
int y = array[0].length-1; // int y = 0;
int begin;
while(y>=0 && x<=array.length-1){ // x>=0 && y<=array[0].length-1
begin = array[x][y];
//查找成功
if(target == begin){
return true;
}
//目标大于该元素,坐标向下移动一步(如果选取左下作为起点,坐标则向右移动一步)
if(target > begin){
x++; // y++;
}
//目标小于该元素,坐标向左移动一步(如果选取左下作为起点,坐标则向上移动一步)
if(target < begin){
y--; // x--;
}
}
//查找失败
return false;
}
python:
def Find(self, target, array):
if len(array) == 0 or len(array[0]) == 0:
return False
x = len(array)-1
y = 0
while x>=0 and y<=len(array[0])-1:
pos = array[x][y]
if target == pos:
return True
if target > pos:
y += 1
if target < pos:
x -= 1
return False