代码随想录算法训练营第七天 | LeetCode344.反转字符串、LeetCode541.反转字符串II、卡码网54.替换数字

代码随想录算法训练营第七天 | LeetCode344.反转字符串、LeetCode541.反转字符串II、卡码网54.替换数字

01-1 LeetCode344.反转字符串

相关资源

  • 题目链接:反转字符串

  • 文章讲解:反转字符串

  • 视频讲解:反转字符串

题目:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

第一想法:申请一个新的字符数组就违反了题目的要求,然后突然想到反转字符串其实就是首尾两个字符进行交换,双指针法!

实现:代码如下:

#include
#include
using namespace std;
class Solution {
public:
    void reverseString(vector& s) {
        int i = 0;
        int j = s.size() - 1;
        while (i < j) {
            char temp = s[i];
            s[i] = s[j];
            s[j] = temp;
            i++;
            j--;
        }
        return;
    }
};

看完代码随想录之后的想法:

使用库函数与否的原则:如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数

收获:c++可以直接使用库函数swap

ToDo:定时复习

01-2 LeetCode541.反转字符串II

相关资源

  • 题目链接:反转字符串 II

  • 文章讲解:反转字符串II

  • 视频讲解:541. 反转字符串II

题目:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

第一想法:很复杂地先计算组数,然后计算剩余字符数,然后一组一组处理,剩余字符再处理,最后拼接在一起

实现:

#include
#include
#include 
using namespace std;
class Solution {
public:
    string reverseStr(string s, int k) {
        int group_num = s.size() / (2 * k);
        int remainder = s.size() % (2 * k);
        string new_str = "";
        for (int i = 0;i < group_num;i++) {
            string str_to_be_reverse = s.substr(i*2*k,k);
            string str_to_keep = s.substr(i * 2 * k + k, k);
            reverse(str_to_be_reverse.begin(),str_to_be_reverse.end());
            new_str.append(str_to_be_reverse);
            new_str.append(str_to_keep);
        }
        if (remainder < k) {
            string str_to_be_reverse = s.substr(group_num * 2 * k);
            reverse(str_to_be_reverse.begin(), str_to_be_reverse.end());
            new_str.append(str_to_be_reverse);
        }
        else {
            string str_to_be_reverse = s.substr(group_num * 2 * k,k);
            reverse(str_to_be_reverse.begin(), str_to_be_reverse.end());
            string str_to_keep = s.substr(group_num * 2 * k+k);
            new_str.append(str_to_be_reverse);
            new_str.append(str_to_keep);
        }
        return new_str;
    }
};

遇到的问题:逻辑太复杂

看完代码随想录之后的想法:通过i+=2k可以分段处理,不要思维定势!此外reverse函数可以自己写

收获:reverse(s.begin() + i, s.begin() + i + k )可以翻转字符串s的相应段

ToDo:通过i+=2k进行分段处理

01-3 卡码网54.替换数字

相关资源

  • 题目链接:54. 替换数字(第八期模拟笔试) (kamacoder.com)
  • 文章讲解:替换数字

题目:

题目描述

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。

输入描述

输入一个字符串 s,s 仅包含小写字母和数字字符。

输出描述

打印一个新的字符串,其中每个数字字符都被替换为了number

输入示例

a1b2c3

输出示例

anumberbnumbercnumber

提示信息

数据范围:1 <= s.length < 10000。

第一想法:so easy!先创建一个空字符串,直接遍历一遍字符串,然后里面的字符如果是字母,直接push_back,如果是数字,则加上"number"这个字符串

实现:

#include
#include 
using namespace std;
int main() {
	string str;
	cin >> str;
	string new_str = "";
	for (int i = 0;i < str.size();i++) {
		if (str[i] >= 'a' && str[i] <= 'z') {
			new_str.push_back(str[i]);
		}
		else {
			new_str += "number";
		}
	}
	cout << new_str << endl;
}

看完代码随想录之后的想法:数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作

ToDo:重做本题,不要新创建字符串

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