经典算法面试题目-翻转一个C风格的字符串(1.2)

题目:
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个字符来表示,包含末尾的 结束字符)

解答:
这道题如果就是要考察你有没有注意到C风格字符串最后的那个结束符,那我觉得还是像书 上写的那样,在代码中有所体现。代码如下:

博主表示对这个第一种方法有点懵逼,有懂的大神麻烦教导一下,O(∩_∩)O谢谢。指针方面,我基本上没怎么学~~~

void swap(char &a, char &b){
    a = a^b;
    b = a^b;
    a = a^b;
}

void reverse1(char *s){
    if(!s) return;
    char *p = s, *q = s;
    while(*q) ++q;
    --q;
    while(p < q)
        swap(*p++, *q--);
}

否则的话,可以直接获取字符串的长度,然后从两头开始一一交换相应的字符。代码如下:

void swap(char &a, char &b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}

void reverse2(char *s)
{
    int n = strlen(s);
    for(int i=0; i < n/2; ++i)
        swap(s[i], s[n-i-1]);
}

完整代码如下:

#include <iostream>
#include <cstring>
using namespace std;

void swap(char &a, char &b){
    a = a^b;
    b = a^b;
    a = a^b;
}

void reverse2(char *s){
    int n = strlen(s);
    for(int i=0; i<n/2; ++i)
        swap(s[i], s[n-i-1]);
}

void reverse1(char *s){
    if(!s) return;
    char *p = s, *q = s;
    while(*q) ++q;
    --q;
    while(p < q)
        swap(*p++, *q--);
}

int main(){
    char s[] = "1234567890";
    reverse1(s);
    cout<<s<<endl;
    return 0;
}

我对第一种方法的理解:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

void swap(char &a, char &b){
    a = a^b;
    b = a^b;
    a = a^b;
}

void reverse2(char *s){
    int n = strlen(s);
    for(int i=0; i<n/2; ++i)
        swap(s[i], s[n-i-1]);
}

void reverse1(char *s){
    if(!s) return;
    printf("%d\n",s);//s是一个地址
    char *p = s, *q = s;
    printf("%d\n",p);
    printf("%d\n",*p);//*p代表当前地址的一个字符
    while(*q){//遇到结束符的时候*p的值是0
        ++q;
        printf("p=%d*\n",q);
        printf("*p=%d*\n",*q);
        //最后一个是字符串的结束符
    }
    --q;
    printf("*%d*\n",q);//此时的q为结束符之前的一个字符
    //此时q指向结束,p是指向开头
    while(p < q)//一直交换,直到中间位置
        swap(*p++, *q--);
}

int main(){
    char s[] = "abcdefghi";
    reverse1(s);
    cout<<s<<endl;
    return 0;
}

详细解释下c风格字符串:
c风格的字符串是用数组存放的,一般要以’\0’结束
而c++主要以string类代替,更加高效,且不易出错

例如:string str = “123”;就是c++的风格;
char str[4]=”123”;就是c风格
string是c++中的关键字,和int,float等等一样, 在c++中,string 定义的变量可以直接存储字符串。在C语言中是没有这种直接存储字符串的变量的。
[ ]里面是4,是因为,C风格的字符串,在最后都会默认添加’\0’,所以”123”本质上是1 2 3 ‘\0’
它其实是占四个字节。所以如果你只定义3个存储空间的话,那’\0’这个字符串终止标志就回被丢弃,那么以后的应用就回出现问题。举个例子:你用strlen(str)试试查看长度为3时的这个字符串的长度,很可能就会有问题。 ‘\0’ 是c字符串都存在的。

时间: 2024-08-02 02:38:30

经典算法面试题目-翻转一个C风格的字符串(1.2)的相关文章

经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)

题目: Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures? 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构. (即只使用基本的数据结构) 解答: 首先,你可以问面试官,构成字符串的字符集有多大?是ASCII字符,还是只是26个字母? 还是有更大的字符集,对于不同

经典算法面试题目-设计算法移除字符串中重复的字符(1.3)

题目 Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not. FOLLOW UP Write the test cases for this metho

经典算法面试题目-判断两个字符串是否是变位词(1.4)

题目 Write a method to decide if two strings are anagrams or not. 写一个函数判断两个字符串是否是变位词. 解答 变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词. 比如说, abbcd和abcdb就是一对变位词. 也就是说,2个字符串,不管排列顺序如何,只要全部的单个字符能对应上,就是一对变位词! 该题目有两种做法: 时间复杂度为O(nlogn)的解法 由于组成变位词的字符是一模一样的,所以按照字典序排序后,两

经典算法面试题目-置矩阵行列元素为0(1.7)

题目 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0. 写一个函数处理一个MxN的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0. 解答 简单题.遍历一次矩阵,当遇到元素等于0时,记录下这个元素对应的行和列. 可以开一个行数组row和列数组col,当元素a[i][j]等于0时, 就把row[i]和col[j]置为1. 第二次遍

经典算法面试题目-矩阵旋转90度(1.6)

题目 Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place? 一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度. 你能原地进行操作吗?(即不开辟额外的存储空间) 解答 我们假设要将图像逆时针旋转90

经典算法面试题目-判断s2是否是s1的旋转字符串(1.8)

题目 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., "waterbottle" is a rotation of &qu

关于贪心算法的题目的一个问题

问题描述 关于贪心算法的题目的一个问题 OJ上的一道题Given Length and Sum of Digits 题目是 我写的答案是 代码链接是 http://codepad.org/LirbPkpG 在oj上提交后出现"Wrong answer on test 8" 这是因为错在哪里? 解决方案 一个贪心算法实例Dijkstra算法是解单源最短路径问题的一个贪心算法 解决方案二: 应该是说的,这道题答案是错误的,你没有在本地环境测试一下么,报错是啥内容,这个算法乍一看,看不出问题

笔试题目“翻转字符串”的实现

笔试题目 //写一个函数,将字符串翻转,翻转方式如下:"I am a student"反转成"student a am I",不借助任何库函数. 据说这题在笔试或者面试当中,出现的频率非常高.刚好在书上也看到这题,又在博客园看到这题出现了("发职位经典面试题"). 作者也提示了,方法是先反转整个字符串,然后再反转字串.譬如先将"I am a student"反转为"tneduts a ma I",然后再对每

经典算法(12) 数组中只出现1次的两个数字(百度面试题)

首先来看题目要求: 在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找 出这两个数字. 考虑下这个题目的简化版--数组中除一个数字只出现1次外,其它数字都成对出现 ,要求尽快找出这个数字.这个题目在之前的<位操作基础篇之位操作全面总结>中的"位操作趣味应用" 中就已经给出解答了.根据异或运算的特点,直接异或一次就可以找出这个数字. 现在数组中有两个 数字只出现1次,直接异或一次只能得到这两个数字的异或结果,但光从这个结果肯定无法得到这个两个数字 .因此我