CareerCup之1.2C风格字符串翻转

【题目】

原文:

Write code to reverse a C-Style String. (C-String means that “abcd” is represented as five characters, including the null character.)

译文:

写代码翻转一个C风格的字符串。(C风格的意思是"abcd"需要用5个字符来表示,包含末尾的 结束字符)

【分析】

这是一道经典的面试题目,虽然看似简单,但仍然有陷阱。唯一的陷阱就是空间复杂度为O(1)即原地置换,要特别注意null字符。

【代码1】

/*********************************
*   日期:2014-05-05
*   作者:SJF0115
*   题目: C风格字符串翻转
*   来源:CareerCup
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

//C风格字符串翻转
void Reverse(char *str){
    if(str == NULL){
        return;
    }
    char *beg = str;
    char *end = str;
    //end指向最后一个元素
    while(*end){
        end++;
    }
    //注意
    --end;
    char temp;
    //交换
    while(beg < end){
        temp = *beg;
        *beg = *end;
        *end = temp;
        end--;
        beg++;
    }
}

int main(){
    char str[] = "1234567890";
    Reverse(str);
    puts(str);
    return 0;
}

【代码2】

//C风格字符串翻转
void Reverse(char *str){
    if(str == NULL){
        return;
    }
    int len = strlen(str);
    char temp;
    //交换
    for(int i = 0;i < len / 2;i++){
        temp = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = temp;
    }
}

【代码3】

交换的进一步优化,使用异或进行交换:

//C风格字符串翻转
void Reverse(char *str){
    if(str == NULL){
        return;
    }
    char *beg = str;
    char *end = str;
    //end指向最后一个元素
    while(*end){
        end++;
    }
    //注意
    --end;
    char temp;
    //异或 交换
    while(beg < end){
        *beg = *beg^*end;
        *end = *beg^*end;
        *beg = *beg^*end;
        end--;
        beg++;
    }
}

CareerCup之1.2C风格字符串翻转

时间: 2024-10-15 22:46:24

CareerCup之1.2C风格字符串翻转的相关文章

c风格字符串,字符串字面值,c++字符串

C风格字符串:本质上就是以空字符null为结束符的数组 可以简单的理解为:有'\0'的是c风格字符串,无'\0'的是普通字符数组 字符串字面值:是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示. C++字符串:通俗而言是string类,为和c语言兼容,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符.(实际上在c++中,string最好直接理解为一个基本类型,相关操作都封装在string类中,避免使用char *出错) 由下面的代码可以看出: int main()

C风格字符串和C++ string 对象赋值操作的性能比较

<<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: 1 #include "stdafx.h" 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 #include <ctime> 6 7 using namespace

string字符串转C风格字符串 进而转换为数字

要求如题 头文件stdlib.h中有一个函数atof() 可以将字符串转化为双精度浮点数(double) double atof(const char *nptr); 此字符串为C风格字符串,因此需要将string转化为C风格字符串 此时可用到一个函数c_str() const char *c_str() 参考资料: string中c_str().data().copy(p,n)函数的用法 在使用c_str()时遇到了一个问题–此函数的返回值为const char * 因为是const数据类型,

字符串翻转,单词内不翻转

字符串翻转,单词内不翻转.如I am from Chongqing->Chongqing from am I 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 void reverse(char *str, int beg, int end); 6 void reverseSentece(char *str); 7 int main() 8 { 9 char str[128]; 10

字符串翻转

字符串翻转 对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形.首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写.比如"Hello World"变形后就变成了"wORLD hELLO". 输入描述: 给定一个字符串s以及它的长度n(1≤n≤500) 输出描述: 请返回变形后的字符串.题目保证给定的字符串均由大小写字母和空格构成

CareerCup之1.4判断字符串是否为变位词

[题目] 原文: 1.4 Write a method to decide if two strings are anagrams or not. 译文: 写一个函数判断两个字符串是否是变位词. [分析] 变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词.比如说, abbcd和abcdb就是一对变位词.该题目有两种思路: [思路一] 由于变位词只是字母的顺序改变,字符长度,字符种类没有改变,所以根据此我们只要重新根据字典序排序一下,两个字符串也就一样了. The eyes

C风格字符串

尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们.这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因. 字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串.C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法.按此习惯书写的字符串存放在字符数组中并以空字符串结束.以空字符结束的意思是在字符串最后一个字符后面跟着一个空字符('\0').一般利用指针来操作这些字符串. C标准库String函数

删除 C 风格字符串中间的 &#39;*&#39;(不用库函数)

char* removeMiddleStar(char *str) { if (!str) return str; char *p = str; for(; *p == '*'; ++p); char *q = p; while(*++q != '\0'); while(*--q == '*'); for (char *k = p; *k != '\0'; ++k) if ((k < q && *k != '*') || k >= q) *p++ = *k; *p = '\0'

JAVA用标准库自己写一个字符串翻转方法,翻转字符串中字母非单词

例如输入:I love programming 输出:I evol gnimmargorp 算法思路就是:根据空格提取每一个单词,存放在一个buffer里进行翻转处理,再添加到新的字符串.最后新的字符串就完成整个方法过程. public class ReserveString { public String reserve(String sentence){ String backS = new String(); StringBuffer temp = new StringBuffer();