您的位置:首页 > Web前端

剑指offer在线编程题汇总与讲解(part 1)

2015-09-14 20:25 399 查看

1.二维数组中的查找

题目描述:

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路:

1.代码要求使用vector来保存二维数组的,那么我们首先应该熟悉如何用vector来表示行以及列;

2.解题思路有多种,比如我们可以从左下角或者右上角开始扫描整个数组,为什么?从题目可以知道,从上到下,是递增的;从左到右也是递增的。假设我们从左下角开始遍历,如果他大于这个数值,可以排除他所在的行;如果他小于的话,可以排除他所在的列。那我们每次判断就可以缩小一行或者一列的范围,直到找到这个数字。

3.我是以右上角开始遍历的,小伙伴们可以试一下左下角的遍历方法~~~

C++代码:

class Solution {
public:
    bool Find(vector<vector<int> > array,int target) {
        int rows = array.size();
        int columns = array[0].size();
        int i=0;
        int j=columns-1;
        while(i<rows && j>=0){
            if(target == array[i][j]){
                return true;
               
            }
            if(target>array[i][j]){
                    i++;
                    continue;
            }
             if(target<array[i][j]){
                    j--;
                    continue;
                }
            
        }
        return false;
        
        
    }
};


2.替换空格

题目描述:

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are
Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路:

1.遍历整个字符串,统计空格出现的次数

2.因为所要替换的字符串为'%20',把字符串看成是一个数组,那么‘%20’是需要占3位的,所以们应该算出替换后的字符串的长度=原来的字符串长度+空格数*2;

3.在我们统计空格数的时候是从左到右统计的,而填充字符时就应该变成从右向左。

4.Ps.其实C++有一个库函数replaceAll(),他具有两个参数(‘被替换的字符’,‘想要替换的字符’),但用的时候一定要保证位置留够,不要塞不下~~

class Solution {
public:
	void replaceSpace(char *str,int length) {
       
            int newlength=0;
            int space_num=0;
            for(int i=0;i<length;i++){
                if(str[i]==' '){
                   space_num++; 
            }
        }
        
        
           newlength = length + space_num*2;
            int m = newlength-1;
            for(int num=length-1;num>=0;num--){
                if(str[num]==' '){
                    str[m--]='0';
                    str[m--]='2';
                    str[m--]='%';
                }else{
                 str[m--]=str[num];
                    
                }
            }
    }
	
};


3.从尾到头打印链表

题目描述:

输入一个链表,从尾到头打印链表每个节点的值。

解题思路:

可以提供两种方法:

1.先遍历一遍链表,记录链表的长度;再根据长度重新开辟一个数组,再从后往前遍历一遍链表,将链表值放入数组中打印出来就可以了。

2.想一下,从尾到头首先是不是可以想到栈?先进后出的原则,我们可以将扫描到的链表值放入栈中,然后直接取出就可以了。

<span style="font-size:14px;">/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {
        std::stack<ListNode*>stk;
        vector<int>value;
        ListNode* p=head;
        while(p!=NULL){
            stk.push(p);
            p=p->next;
            
        }
        ListNode* ps;
        while(!stk.empty()){
            p = stk.top();
            value.push_back(p->val);
            stk.pop();
        }
        return value;
       
        }
        
    
};</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: