算法题摘录一

转载请注明原文地址:

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

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

前序遍历:根左右

中序遍历:左根右

后序遍历:左右根

时间: 2024-10-18 18:27:16

算法题摘录一的相关文章

笔试算法题(09):查找指定和值的两个数 & 构造BST镜像树

出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{-i-j-k-m--},只有可能是i+m=j+k(j和k可能是同一个数),所以可以从两边往中间收缩而忽视其他交叉相加的情况: 解题: 1 void FindSumFactor(int *array, int length, int sum) { 2 int left=0, right=length-1; 3 whil

笔试算法题(08):输出倒数第K个节点

出题:输入一个单向链表,要求输出链表中倒数第K个节点 分析:利用等差指针,指针A先行K步,然后指针B从链表头与A同步前进,当A到达链表尾时B指向的节点就是倒数第K个节点: 解题: 1 struct Node { 2 int v; 3 Node *next; 4 }; 5 Node* FindLastKth(Node *head, int k) { 6 if(head==NULL) { 7 printf("\nhead is NULL\n"); 8 exit(0); 9 } 10 Nod

笔试算法题(07):还原后序遍历数组 & 半翻转英文句段

出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历): 分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树): 解题: 1 bool PostOrderCheck(int *array, int i, int j) { 2 /** 3 * 如快速排序一样,解决小子文件 4 * */ 5 if(j-i+1 ==

java基础算法题

为了提高自己的代码能力和算法能力,我决定每天学习一道算法题,吸收前辈思想. [程序1] TestRabbit.java 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析:兔子数量的规律为数列:1,1,2,3,5,8,13.....其实就是斐波那契数列  使用递归就可以实现 1 /** 2 * 兔子问题 3 * 2016/5/9 4 * 斐波那契数列求值 5 *题目:古典问题:有一对兔子,

ios 算法题

1兔子算法题 兔子可以跳一步2步或者3步,问跳到100有多少种跳法? // 兔子可以跳一步2步或者3步 // 问跳到100有几种跳法 /* 分析1 两个变量,X*2+Y*3=100. X最大为50,X最小为2 Y最大为32.最小为0 分析2 某个情景分析:假设X=35,Y为10时, 虽然知道了数量,但是兔子的35小步,和10大步的顺序是怎样的? 应为组合-> 45个节点中,选择10个放三步的.那就是简单的C(45 10).变成阶乘,就解得出来. */ double temp=0.0f; for

[solution]腾讯TEG_计算广告组_算法题

度娘笔试归来,题目实打实的,感觉真心不易,上百号人就抢那么几个坑......只恨自己平时积累太少啊~ 故曝一道鹅厂面试用的算法题(当时我就死在了这题上),来为度娘家攒一下RP~ 题目: 对于长度为N的一个无序的数组a[1..N],请将a进行排序,要求所有正数都排在0之前,所有负数都排在0之后(如果没有0,则所有正数排在负数前) 要求时间复杂度O(N),空间复杂度O(1) 题目不难,但给思考的时间很短,大约不到5分钟吧.当时脑子比较短路,于是只给出了O(n) O(n)复杂度的算法,然后就被面试官挂

算法题——翻转链表中的一段

题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转. 思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N):如果要求不能交换值,那么仅凭p1和p2是无法翻转的,只能交换两个指针之间的链表. 代码: 交换值: 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 void reverseNodes(ListNode *p1, ListNode *p2) { 8 if ( p1 == NULL || p2 == NU

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

一天一道算法题---6.26---二分查找

感谢微信平台---一天一道算法题----每天多一点进步-- 好累啊  现在在用win7自带的输入法 打起来真麻烦 快点把这2天的搞完就重装了 还是直接来源于----〉 待字闺中 分析 给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复,请给出方法,找到这个Magic Index.更进一步,当A中允许有重复的元素,该怎么办呢? 没有重复元素的情况 一些同学在遇到这个题目的时候,往往会觉得比较简单.