剑指offer58. 翻转字符串 P284

剑指offer58. 翻转字符串 P284

  1. 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
 (1)	可以用string一个从前一个从后+
 (2)	用栈存string  
(3)   书上的方法,先反转整个数组,然后反转每个单词。
char* ReverseSentence(char *pData)
{
    if(pData == nullptr)
        return nullptr;

    char *pBegin = pData;
    char *pEnd = pData;
    while(*pEnd != '\0')        // 找输入字符串的结尾
        pEnd ++;
    pEnd--;

    // 翻转整个句子
    Reverse(pBegin, pEnd);   

    // 翻转句子中的每个单词
    pBegin = pEnd = pData;
    while(*pBegin != '\0')
    {
        if(*pBegin == ' ')        // 跳过空格
        {
            pBegin ++;
            pEnd ++;
        }
        else if(*pEnd == ' ' || *pEnd == '\0')  // 句子中间遇到空格,或者遍历结束
        {
            Reverse(pBegin, --pEnd);      // 反转begin和end之间的单词
            pBegin = ++pEnd;
        }
        else
            pEnd ++;                   // begin和end之间还不是一个单词
    }
    return pData;
}

void Reverse(char *pBegin, char *pEnd)  // 反转数组
{
    if(pBegin == nullptr || pEnd == nullptr)
        return;

    while(pBegin < pEnd)
    {
        char temp = *pBegin;
        *pBegin = *pEnd;
        *pEnd = temp;

        pBegin ++, pEnd --;
    }
}

面试题58(二): 左旋转字符串 P286

题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。

方法1:书上方法

char* LeftRotateString(char* pStr, int n)
{
    if(pStr != nullptr)
    {
        int nLength = static_cast<int>(strlen(pStr));
        if(nLength > 0 && n > 0 && n < nLength)
        {
            char* pFirstStart = pStr;
            char* pFirstEnd = pStr + n - 1;
            char* pSecondStart = pStr + n;
            char* pSecondEnd = pStr + nLength - 1;

            // 翻转字符串的前面n个字符
            Reverse(pFirstStart, pFirstEnd);
            // 翻转字符串的后面len-n个字符
            Reverse(pSecondStart, pSecondEnd);
            // 翻转整个字符串
            Reverse(pFirstStart, pSecondEnd);
        }
    }

    return pStr;
}

方法2: string 分割之后+

char *LeftRotateString(char *in, int k) {
	if (in == NULL) return NULL;
	
	int len = 0;
	char *p = in;
	while((*p) != '\0') {
		++p;
		++len;
	}
	if (k == 0 || k >= len) return in;
	string strfront = "";      
	string strback = "";
	for (int i = 0; i < k; ++i) {
		strfront += in[i];
	}
	for (int i = k; i < len; ++i) {
		strback += in[i];
	}
	char ans[len];       // 这里不能用char *ans ,, 原因见下面(string和char*转换问题)
	strcpy(ans, (strback + strfront ).c_str());
	return ans;

}

char* c;
string s=“1234”;
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理
应该这样用:
char c[20];
string s=“1234”;
strcpy(c,s.c_str());
返回 c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值