算法学习(LeetCode)-反转字符串中的单词

要求:给定一个字符串,反转串中的每个单词的字母顺序,但每个单词的顺序保持不变。

C语言实现:

char * reverseWords(char * s){
    int length=strlen(s); //获取字符串的长度
    int i=0;    //计数器
    while(i<length){ //循环到字符串末位
        int start=i; //标记当前单词的起始位置
        while(i<length&&s[i]!=' '){ //循环到当前单词的末位
            i++;
        }
        int right=i-1; //存储当前单词的末位标号
        for(int left=start;left<right;left++){ //反转单个单词
            s[left]^=s[right];
            s[right]^=s[left];
            s[left]^=s[right];
            right--;
        }
        while(i<length&&s[i]==' '){ //跳过字符串中的空格位
            i++;
        }
    }
    return s;
}

运行结果:

要求:原地反转输入字符串,在空间复杂度为O(1)的前提下解决问题。

java:

法一:


class Solution {
    public void reverseString(char[] s) {
        int len=s.length,size=len; //获取字符串的长度
        for(int i=0;i<len/2;i++){ //前半段和后半段互换的循环条件
            size--;    //size先左移一位,因为数组的标号从0开始
            char tmp=s[i];    //借助第三变量暂时存储数组的值
            s[i]=s[size];    //将后段字符存储到前段位置
            s[size]=tmp;    //位置互换完成
        }
 
    }
}

法二:位运算(异或)

异或运算:

a=a^b;

b=a^b;

a=a^b;

一个变量异或本身恒等于0:a^a=0;

一个变量异或0恒等于本身:a^0=a;

同时,满足交互律和分配律,用该方式省去了O(1)的空间开销,代码实现如下:


class Solution {
    public void reverseString(char[] s) {
        int len = s.length,j=len;
        for (int i = 0; i < len / 2; ++i) {
            j--;
            s[i] ^= s[j];
            s[j] ^= s[i];
            s[i] ^= s[j];
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值