V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nomemo
V2EX  ›  程序员

求教 557. Reverse Words in a String III,使用 C 语言写..

  •  
  •   nomemo ·
    nomemo · 2017-06-20 19:23:14 +08:00 · 2983 次点击
    这是一个创建于 2719 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.

    Example 1:

    Input: "Let's take LeetCode contest"
    Output: "s'teL ekat edoCteeL tsetnoc"
    

    Note: In the string, each word is separated by single space and there will not be any extra space in the string.

    地址: https://leetcode.com/problems/reverse-words-in-a-string-iii/#/description

    不使用额外空间,但 c 的字符串不应该是常量不可修改嘛?

    为何我看别人写的都是直接对字条串的单个字符进行修改呢

    void reverse(int b, int e, char *s){
        while(b < e) {
            s[b] = s[b] ^ s[e];
            s[e] = s[b] ^ s[e];
            s[b] = s[b] ^ s[e];
            b++;
            e--;
        }
    }
    
    char* reverseWords(char* s) {
        int i, s_len = strlen(s), index = 0;
        
        for(i = 0; i <= s_len; i++) {
            if((s[i] == ' ') || (s[i] == '\0')){
                reverse(index, i - 1, s);
                index = i + 1;
            }
        }
        return s;
    }
    
    第 1 条附言  ·  2017-06-20 20:42:27 +08:00

    感谢各位

    问题解决,我自己写题的时候会使用测试数据

    char *testInput = "Let's take LeetCode contest"
    

    虽然是使用C写,但以前就学得不是很精,谢谢指导

    9 条回复    2017-06-21 13:27:18 +08:00
    bombless
        1
    bombless  
       2017-06-20 20:12:35 +08:00 via Android   ❤️ 1
    是字面量对应的匿名数组不可写而已。
    其实是一个运行时行为,和常量什么的就没啥关系了
    Mirana
        2
    Mirana  
       2017-06-20 20:21:03 +08:00   ❤️ 1
    传进来的不是常量啊
    mason961125
        3
    mason961125  
       2017-06-20 20:30:52 +08:00
    C 什么时候不许改字符串了?和 Python 搞混了?
    skydiver
        4
    skydiver  
       2017-06-20 20:37:06 +08:00 via Android
    用异或做交换的直接 pass
    mrvon
        5
    mrvon  
       2017-06-20 20:38:13 +08:00   ❤️ 1
    你仔细看,这个是
    char* s
    而不是
    const char* s
    nomemo
        6
    nomemo  
    OP
       2017-06-20 20:48:06 +08:00
    @bombless
    @Mirana
    @mrvon

    感谢,明白了


    @skydiver

    请指教原因?
    si
        7
    si  
       2017-06-21 09:57:26 +08:00   ❤️ 1
    char *testInput = "Let's take LeetCode contest"; 这种是定义 char 指针,指针指向 "Let's take LeetCode contest",一般编译器会把 "Let's take LeetCode contest" 放到常量段。一般常量段是只读的,如果对它写入,就会崩溃。

    char testInput[] = "Let's take LeetCode contest"; 这样是定义一个 char 数组,并把"Let's take LeetCode contest"拷贝到数组里面。数组是允许读写的。
    ryd994
        8
    ryd994  
       2017-06-21 11:37:17 +08:00
    任何\0 结尾的 char[] 都是 C-string
    demerol
        9
    demerol  
       2017-06-21 13:27:17 +08:00 via Android   ❤️ 1
    现在的 gcc 貌似 xor 的速度不如加个 temp
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2667 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:13 · PVG 13:13 · LAX 21:13 · JFK 00:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.