【剑指offer{1-3}】二维数组查找、空格替换、从尾到头打印链表

本文介绍了三个算法问题的解决方案:首先,详细阐述了如何在有序二维数组中查找特定整数,采用从右上角开始比较的方法;接着,讲解了如何使用C++替换字符串中的空格为'%20';最后,展示了如何按链表值从尾到头的顺序返回ArrayList,利用栈的特性实现反向打印链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


注:代码均在牛客网上运行,结果均通过!


二维数组查找

题目描述

  • 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
  • 选择最右上角的数值与给定的target进行比较,如若数值小则往下移,如若数值大则往左移即可。

C++代码展示

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

空格替换

题目描述

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

C++代码展示

class Solution {
public:
	void replaceSpace(char *str,int length) 
    {
        if(str==NULL)
        {
            return;
        }
        int lenSpace = 0;
        int oldLength = 0;
        for(int i = 0;i<length-1;i++)
        {
            if(str[i]==' ')
            {
                lenSpace++;
            }
            oldLength++;
        }
        int newLen = oldLength + lenSpace*2;
        int first = oldLength-1;
        int last = newLen-1;
        while(first<=last && first>=0)
        {
            if(str[first]!=' ')
            {
                str[last--] = str[first];
            }
            else if(str[first]==' ')
            {
                str[last--] = '0';
                str[last--] = '2';
                str[last--] = '%';
            }
            first--;
        }
	}
};

从头到尾打印链表

题目描述

  • 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
  • 压入一个栈中,栈的特点是先进后出,因此栈顶元素就是链表的表尾节点,依次弹出。

C++代码展示

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) 
    {
        vector<int>result;
        if(head==NULL)
        {
            return result;
        }
        ListNode*p = head;
        ListNode*q = head->next;
        head->next = NULL;
        ListNode *r = NULL;
        while(q!=NULL)
        {
            r = q->next;
            q->next = p;
            p = q;
            q = r;
        }
        head = p;
        ListNode *ptemp = head;
        while(ptemp!=NULL)
        {
            result.push_back(ptemp->val);
            ptemp = ptemp->next;
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值