算法题摘录一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题摘录一相关的知识,希望对你有一定的参考价值。

转载请注明原文地址:

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:由前序遍历,中序遍历重建二叉树

首先重温二叉树的遍历方式:

前序遍历:根左右

中序遍历:左根右

后序遍历:左右根

 

以上是关于算法题摘录一的主要内容,如果未能解决你的问题,请参考以下文章

动态SQL基础概念复习(Javaweb作业5)

译丨Yarn - Javascript 新一代套件管理

算法竞赛入门码蹄集进阶塔335题(MT2286-2290)

算法竞赛入门码蹄集新手村600题(MT1351-1400)

算法竞赛入门码蹄集新手村600题(MT1501-1550)

算法竞赛入门码蹄集新手村600题(MT1401-1450)