首页 > 其他分享 >代码随想录第八天|字符串part01--344.反转字符串、541.反转字符串Ⅱ、卡玛网54.替换数字

代码随想录第八天|字符串part01--344.反转字符串、541.反转字符串Ⅱ、卡玛网54.替换数字

时间:2024-11-12 12:19:49浏览次数:3  
标签:String int 反转 chars 随想录 字符串 left

资源引用:

leetcode题目:

344.反转字符串(344. 反转字符串 - 力扣(LeetCode)

541.反转字符串Ⅱ(541. 反转字符串 II - 力扣(LeetCode)

卡玛网题目:

卡玛网54.替换数字(54. 替换数字(第八期模拟笔试) (kamacoder.com)

碎碎念回归:

本来应该11月6号打卡的,因为接连4天的考试+多个竞赛,导致推迟到了今天才补做,现在也到了这个学期最忙的最后一个星期了,希望自己能调整好状态,安排好时间,脚踏实地朝着目标前进,加油!

344.反转字符串(344. 反转字符串 - 力扣(LeetCode)

题目分析:

要将输入的字符串反转过来,通过原地修改输入数组进行实现(即空间复杂度为O(1)),已经提示每个字符都是ASCII码表中的。不能使用reverse函数解决,考虑使用左右双指针和临时交换量解决。

解题思路:

左指针left初始化为0即指向字符串开头,右指针right初始化为s.length-1即指向字符串末尾。不断交换left和right所指向的两个字符,每交换一次,left++和right--,直至left<right这一循环不变量不满足为止。

总结:

尝试使用异或运算的性质,实现交换。

class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while (l < r) {
            s[l] ^= s[r];  //构造 a ^ b 的结果,并放在 a 中
            s[r] ^= s[l];  //将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b
            s[l] ^= s[r];  //a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换
            l++;
            r--;
        }
    }
}

541.反转字符串Ⅱ(541. 反转字符串 II - 力扣(LeetCode)

题目分析:

对字符串s做跨步为2k的反转操作,每跨步2k,对前k个字符串做反转计算。注意两个边界情况:若该次跨步的剩余字符不足k个,则全部反转;若该次跨步的剩余字符不足2k个但不少于k个,则仍反转前k个字符。仍然考虑使用双指针和位运算交换来解决。

解题思路:

设计一个交换函数mySwap(string S, int left, int right),left和right用于标示将要反转的字符串区间。主函数使用循环进行多次跨步操作,循环不变量是当前的指针不可越界,跨步操作注意三种不同情况的跨步结束。

总结反思:

1.跨步一次跨2k步即可

2.使用Math.min(chars.length-1, cur+k-1)可以方便判断当前剩余区间长度是否小于k,并取两者之中的小者作为反转区间的右区间,完成反转操作。

3.注意String和char[]之间的转化:

char[] chars= string.toCharArray();

String string= new String(chars[]);

String string= String.valueOf(chars);

class Solution {
    public String reverseStr(String s, int k) {
        if(s.length() == 0){
            return s;
        }

        char[] chars = s.toCharArray();
        int cur=0;
        int left=0;
        int right=0;
        while(cur < chars.length){
            left=cur;
            right=Math.min(chars.length-1, cur+k-1);//用于判断此次反转区间的长度是否不足k,若不足k则将剩余区间全部反转
            myReverse(chars,left,right);
            cur+=2*k;
        }
        return String.valueOf(chars);
    }
    public char[] myReverse(char[] s,int left,int right){
        while(left<right){
            s[left]^=s[right];
            s[right]^=s[left];
            s[left]^=s[right];
            left++;
            right--;
        }
        return s;
    }
}

卡玛网54.替换数字(54. 替换数字(第八期模拟笔试) (kamacoder.com)

题目分析:

对包含小写字母和数字字符的字符串s做替换,将每一个数字字符替换为"number"。这样的操作会导致字符串长度改变,在java中字符串和数组长度均不可变,故需另外新建数组,通过遍历该字符串根据其中包含的数字字符个数来确定新字符串的长度。

解题思路:

将字符串转换为字符数组chars,遍历chars记录数字字符个数,每多一个数字字符,新字符串的长度在原来的字符串的长度上+5(替换后的number有6个字符)。

然后再次遍历字符串数组,逐步填充新的字符串数组,最后打印输出。

import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        scanner.close();
        char[] chars = s.toCharArray();
        int l=chars.length;
        for(char i : chars){
            if(i-'a'>=0 && i-'a'<=25){
                continue;
            }else{
                l+=5;
            }
        }
        char[] newS = new char[l];
        int index = 0;
        for(char i : chars){
            if(i-'a'>=0 && i-'a'<=25){
                newS[index++]=i;
            }else{
                newS[index++]='n';
                newS[index++]='u';
                newS[index++]='m';
                newS[index++]='b';
                newS[index++]='e';
                newS[index++]='r';
            }
        }
        System.out.println(new String(newS));
    }
}

总结反思:

由于java中的字符串和数组长度均不可变,故不得不申请新的空间。若使用其他编程语言,例如c++,在原String的基础上可以扩充长度,如果不允许申请新的字符串数组,可以考虑从后往前填充新的数组,已经读取并填充过的字符会被“安全”覆盖(不会丢失信息)。

标签:String,int,反转,chars,随想录,字符串,left
From: https://blog.csdn.net/csy031117/article/details/143696381

相关文章

  • 代码随想录算法训练营第三天(LeetCode203.移除链表元素;LeetCode707.设计链表;LeetCode20
    LeetCode203.移除链表元素题目链接:LeetCode203.移除链表元素题目链接思路这道题目主要考察的是移除一个链表当中的元素,我们可以先在给定的链表前面加一个虚拟头结点,这样我们对给定链表头结点的操作和给定链表其余结点的操作就会变得相同。代码classSolution{p......
  • 代码随想录算法训练营第四天(LeetCode24.两两交换链表中的节点;LeetCode10.删除链表的倒
    LeetCode24.两两交换链表中的节点题目链接:两两交换链表中的节点题目链接思路这道题其实就是一个模拟题,要求每次交换链表中两个相邻的节点(1、2节点互换;3、4节点互换;2、3节点不互换,意思就是交换过的节点不参与后续的交换了),同时只能进行节点交换,不能进行值交换。主要考......
  • 图像转字符串
    图像转字符串publicstaticStringimageToString(StringfilePath){try(FileInputStreamimageInFile=newFileInputStream(filePath)){byte[]imageBytes=newbyte[(int)newFile(filePath).length()];imageInFile.read(imageBytes);String......
  • 3258. 统计满足 K 约束的子字符串数量 I
    题目链接解题思路小字符串不满足了,那么包含此小字符串的大字符串肯定不满足。大字符串满足,那么该字符串的所有子串都满足条件。所以,我们就可以把问题转成,「以i开头的字符串,满足条件的,最长多长?」然后再根据这个结果,计算以i开头的所有子串数目即可。计算了「以i开头的最长......
  • 【优选算法 — 滑动窗口】水果成篮 & 找到字符串中所有字母异位词
         水果成篮  水果成篮  题目描述  因为只有两个篮子,每个篮子装的水果种类相同,如果从0开始摘,则只能摘0和1两个种类;因为当我们在两个果篮都装有水果的情况下,如果再走到下一颗果树,果树的水果种类不是果篮中的任意一种,则停止采摘;所以就是要找......
  • 代码随想录算法训练营第二十二天| leetcode77. 组合、leetcode216.组合总和III、leetc
    1leetcode77.组合题目链接:77.组合-力扣(LeetCode)文章链接:代码随想录视频链接:带你学透回溯算法-组合问题(对应力扣题目:77.组合)|回溯法精讲!_哔哩哔哩_bilibili思路:开始想循环,感觉行不通,然后看了视频,就嗯理解了一些感觉跟递归的思路确实差不多1.1回溯三部曲回溯的方法首......
  • 844. 比较含退格的字符串
    题目说实话自己在尝试这道题的时候没什么清晰的思路和实现方法。看了官方题解,官方提供了两种方法:方法一:这个重构字符串刚开始也想到了,但是不知道怎么去实现,看了官方题解后,不禁一颤,噢,这是栈的运用啊,仔细想想,也觉得退格带来的效果真的很像栈顶元素的弹出。官方代码如下:class......
  • 代码随想录算法训练营day43| 300.最长递增子序列 674. 最长连续递增序列 718. 最长
    学习资料:https://programmercarl.com/0300.最长上升子序列.html#算法公开课动态规划系列之子序列学习记录300.最长递增子序列(长度最少为1;dp[i]代表到i为止的最长子序列的长度;i的值根据i之前比如j的值来判断;每个地方都有可能获得最长长度)点击查看代码classSolution:def......
  • apropos——在 whatis 数据库中查找字符串
    转自于:https://github.com/jaywcjlove/linux-command,后不赘述apropos在whatis数据库中查找字符串补充说明apropos命令在一些特定的包含系统命令的简短描述的数据库文件里查找关键字,然后把结果送到标准输出。如果你不知道完成某个特定任务所需要命令的名称,可以使用一个关......
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.17——字符函数&&字符串函数
    文章目录1.字符函数1.1字符分类函数1.1.1islower1.2字符转换函数1.2.1tolower2.字符串函数2.1strlen2.2strcpy和strncpy2.3strcat和strncat2.4strcmp和strncmp2.5strstr2.6strtok2.7strerror希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的......