day7反转链表&反转链表II替换空格&反转字符串里的单词&左旋转字符串

        Java中有很多对字符串封装的操作,本次解题中不调用方法。

1.力扣344

        利用双指针即可解决反转链表,定义一个left指针指向0,right指向nums.length-1,交换后向中间移动,直至left>=right结束

解题步骤:

  • 定义两个指针,left和right,分别初始化为0和nums.length-1
  • nums【left】和nums【right】交换值,并让左右指针分别向中间移动一步
  • 重复循环,直至left>=right

代码如下:

    public void reverseString(char[] s) {
        int left = 0;
        int right =s.length-1;
        char temp;
        while(left<right){
            temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
    }

2.力扣541

        本题规则比较复杂,搞清楚规则后就就可以轻松解决。

解题步骤:

  • 讲字符串转换为字符数组,并利用for循环遍历数组
  • 定义一个begin和end,分别记录待交换的区域
  • 计算交换区域,begin=i,end=Math.min(nums.length-1,i+k-1)
  • 然后交换数值

代码如下:

    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i=0;i<ch.length;i+=2*k){
            int start = i;
            int end = Math.min(ch.length-1,i+k-1);
            while (start < end) {
                char temp = ch[start];
                ch[start++] = ch[end];
                ch[end--] = temp;
            }
        }
        return new String(ch);
    }

3.剑指Offer 05.替换空格

        本题利用了Java中可变字符串,使解题变得很方便;若不使用可变字符串则需要重新定义空间添加。还有一种思路是根据字符串中空格的数量,对数组进行扩容,然后把元素换位置的时候,顺便替换空格的值。

解题步骤:

  • 定义一个可变字符串(哪个都行),然后遍历字符数组
  • 若值为空格,则存%20进字符串中
  • 若不为空格,则直接存进字符串中
  • 最后可变字符串变为字符串就解决了

代码如下:

    public String replaceSpace(String s) {
        StringBuffer str = new StringBuffer();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(ch!=' '){
                str.append(ch);
            }else{
                str.append("%20");               
            }

        }
        return str.toString();
    }

4.力扣151反转字符串中的单词

        本题难度挺大,研究了好久,差不多一个多点哈哈哈;解题步骤大致分为3步,先反转整个链表,然后在反转每个单词,最后把单词收集起来并添加空格,这个题要多debug!!!

解题步骤:

  • 首先反转整个数组,reverse(arr,0,arr.length-1)
  • 接下来用for循环遍历数组,碰到空格则跳过,当遇到非空字符的时候,则用while循环遍历整个单词,便于反装整个数组
  • 进行反转后,在尾部添加一个空格
  • 最后返回反转后数组,在返回时也需要进行判断,为了防止尾部有多余空格。

代码如下:

    public String reverseWords(String s) {
        //反转整个字符串
        char[] arr = s.toCharArray();
        reverse(arr,0,arr.length-1);
        int k=0;
        int slow = 0;
        for(int i=0;i<arr.length;i++){
            //遇到空得则向后移动
            if(arr[i]==' '){
                continue;
            }
            int tempCur = i;
            while(i<arr.length&&arr[i]!=' '){
                i++;
            }
            for(int j=tempCur;j<i;j++){
                if(j==tempCur){
                    reverse(arr,j,i-1);
                }
                arr[k++] = arr[j];
                if(j==i-1){//遍历结束
                    if (k < arr.length) {
                        arr[k++] = ' ';
                    }
                }
            }
        }
        if(k==0){
            return " ";
        }else{
            return new String(arr, 0, arr[k - 1] != ' ' ? k : k - 1);
        }

    }

    public void reverse(char[] chars,int begin,int end){
        for(int i=begin,j=end;i<j;i++,j--){
            chars[i] ^= chars[j];
            chars[j] ^= chars[i];
            chars[i] ^= chars[j];
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值