题目的主要信息:

  • 输入一个长度不大于30的字符串,再输入一个正整数mmm,将此字符串中从第mmm个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出
  • 要求用指针处理字符串

具体做法:

题目所给的代码中,输入的字符串是一个字符数组,采用getline函数输入,这样会在输入的末尾增加一个'\0'表示字符串的结束,如果长度小于数组长度,输入所有字符后加'\0',如果长度大于数组长度,截断输入的前面部分再在最后加'\0'。

我们准备一个新串来保存复制后的字符串,因为原串大小不会超过30,因此新串的大小也不会超过30.

题目要求使用指针,我们可以用两个指针,指针p一开始指向原串的第m个位置,指针q一开始指向新串的起始位置。然后利用指针p遍历原串,到末尾的'\0'结束,遍历过程中像指针q指向的地址复制指针p指向元素的值,然后指针同步后移。 alt

#include <iostream>
using namespace std;

int main() {

	char str[30] = { 0 };
	cin.getline(str, sizeof(str));
    int m;
	cin >> m;
	// write your code here......
    char copystr[30] = { 0 };
    char* p = str + m - 1; //指向字符数组第m个元素
    char* q = copystr;
    while(*p != '\0'){ //直到字符串结果
        *q = *p; //复制
        p++;; //两边指针都后移
        q++;
    }
    cout << copystr << endl;
	return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n)nnn为字符串的长度,最坏情况一次遍历
  • 空间复杂度:O(1)O(1)O(1),无额外空间