首页 > 代码库 > 算法题摘录一
算法题摘录一
转载请注明原文地址:
1:二维数组查数
输入一个行、列均是递增的二维数组,和一个数。求该数是否在二维数组中。
解法一:这种查找类题目,第一时间想到用map、list等。此处可以先对二维数组遍历,把 每个元素——i+“,”+j(行列坐标) 作为映射转存到Hashmap中,然后对所查的数用
map.get(num)即可。
解法二:由于行列都是递增的,我们就利用这个规律来解题。首先用num与右上角元素比:若相等,则返回true;若num大于这个元素,则说明num在这个元素的下方,而一行的最右元素是该行的最大值了,所以第一行排除掉了,数组行数减一,继续查找;若num小于右上角元素,则说明num在右上角元素的左边,而一列的第一个是该列的最大值,所以最右列排除,列数减一,继续查找......重复以上三步,每步要么减一行要么减一列缩小查找范围,直至找到或者遍历完整个数组。
boolean find(int[][] nums,int num){ boolean res=false; int rows=nums.length; int cols=nums[0].length; while(rows>=0 && clos>=0){ if(nums[rows-1][cols-1]==num){ res=true; break; }else if(nums[rows-1][cols-1]>num){ cols--; }else{ --rows; } } return res; }
2.替换字符串中空格(或其他东西)
此题,要求把字符串中的空格替换成别的东西,比如 %20 这样的字符。
法一:无空间限制,不在原字符串上操作的解法。
用Java来做的话,我们可以新开一个字符串数组,用split(str," ")把原字符串按空格拆分,保存到字符串数组中。然后遍历这个数组,用一个builder来append个个字符串,两两之间插入 %20 取代空格即可。这里要注意考虑特殊情况:原字符串开头、结尾有无空格。可以设置headnull,lastnull两个变量来先统计原字符串头尾的空格数。
法二:有空间限制,只能在原字符串上操作。
设计到内存方面的操作,此法用C++来做。首先遍历原字符串,统计空格数目count;然后计算出取代内容需要多少空间,得出替换后的总空间;p2指针指向替换后字符串末尾,p1指向替换前字符串末尾,p1每遍历一个字符,就移动到p2处,然后p1,p2前移动;若p1遍历到空格,则p2从后往前依次写入0,2,%(每写一个p2前一1位)......直到p1==p2==字符串首地址。
3:倒序输出链表值
链表一般都是顺序遍历比较容易,这里需要倒序输出链表值。如果真的把链表指针反转方向重新构造链表就真是太死脑筋了。我们只需顺序遍历链表,把每个结点的值先存放在数组或栈中。然后再按照倒序输出即可。这种 后进先出 的典型题目应该第一时间就想到栈。
4:由前序遍历,中序遍历重建二叉树
首先重温二叉树的遍历方式:
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
算法题摘录一