LeetCode剑指offer系列题目与解答

LeetCode剑指offer系列题目与解答(C++)

  • easy组
    • 题目01.数组中的重复数字
  • 题解:
    • 1.思路
    • 2.程序源码
    • 题目05.请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
      • 思路
      • 程序源码
    • 题目06.输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
      • 思路:

题目来源于leetcode。

easy组

题目01.数组中的重复数字

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

题解:

1.思路

两种思路
第一种:

2.程序源码


题目05.请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

思路

1).统计原字符串长度len与空格个数count
2). 计算新的字符串长度为:新字符个数=(原字符个数-空格个数)+空格个数*3
3) 从尾部开始遍历,当s[i] 不是空格,将i赋值给j ,else : 将空格替换成%20
4) 当i=j的时候,说明左边已经没有空格了

程序源码

//请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

#include 
#include 
using namespace std;
class solution
{
public:
	string renamespace(string s) {
		int count = 0, len = s.size();
		cout << "开始的string:  " <<s<< endl;
		for (char c : s)
		{
			if (c == ' ') count++;
		}
		//新字符个数=(原字符个数-空格个数)+空格个数*3
		//当i=j,即i和j同步了,代表左边没有空格了。
		s.resize((len - count) + 3 * count);
		for (int i = len - 1, j = s.size() - 1; i=j ; i--, j--)
		{
			if (s[i] != ' ')
			{
				s[j] = s[i];
			}
			else
			{
				s[j] = '0';
				s[j - 1] = '2';
				s[j - 2] = '%';
				j -= 2;
			}
		}
		cout << s;
		return s;
	}
};
int main()
{
	cout << "输入字符串" << endl;
	string s;
	getline(cin, s); //注意此处用的是getline 而不是cin getline 可以将空格读入字符串
	                 //第一个参数表示在输入流中寻找输入字符串的内容,第二个参数表示将字符串存入的目的地
	solution test;
	test.renamespace(s);
	return 0;
}

题目06.输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

思路:

1.创建一个栈stack接受listnode中的val (stack.push());
2.利用栈先进后出的特点将元素一个个放到vector中

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        stack<int> s;//创建一个先进后出的栈

        //将list中的元素放入栈中
        while (head != NULL)
        {
            s.push(head->val);
            head = head->next;
        }
        //出栈操作
        vector<int> v;
        while (!s.empty())
        {
            v.push_back(s.top());
            s.pop();
        }
        return v;
    }
};

你可能感兴趣的:(c++,算法)