首页 > 编程语言 >代码随想录算法训练营第八天|344.反转字符串、541.反转字符串||、卡玛网54.替换数字

代码随想录算法训练营第八天|344.反转字符串、541.反转字符串||、卡玛网54.替换数字

时间:2024-11-20 21:44:38浏览次数:3  
标签:ch int 反转 随想录 start length 字符串 newS 2k

344和541来自leetcode,54来自卡玛网

344.反转字符串

很简单的一道题,直接把数组一分为二,第一个和最后一个互换就行,直到遍历到数组一半,就结束了,从第一个往后就是s[i],最后一个往前就是s[s.lenght - i - 1]。

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

541.反转字符串||

自己做的时候写了一堆逻辑,又是算有几个2k,又是各种计数,把自己绕进入了,求饶了直接看题解了。

其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。

有点绕,耐心看我写,首先这个for循环中的i是以2k大小来-跳动的,也就是每个for循环处理的都是一个2k大小区间内的数据,最后一定会剩下一个不到2k大小的块,此时我们再看题目中要求的,剩余数小于k个时全部翻转,大于k小于2k时翻转前k个,注意!!此时我们是最后一个2k区间内,我们只要翻转前k个就行,不管他什么条件,第一个条件我们满足了,第二个条件翻转前k个我们也满足了,因为这个处理完我们的for循环就结束了。这点一定要注意。

再就是下面的end = Math.min(ch.length - 1,start + k - 1),start是每个2k大小区间内的左指针,end是这个区间内的右指针,我们在前面正常处理时(就是不是最后一个),取到的都是end = start + k - 1,此时我们再看上面的i,他是整个2k区间跳动的,所以这个start是买个区间的开头,再+k就是这个2k区间内的第k个,因为是数组下标我们再-1。

然后就是跟341题一样的翻转数组就行。

public class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        // i每次跳动的位置是2k,也就是一个2k区间,在每个区间内去判断翻转
        for (int i = 0; i < ch.length; i += 2 * k) {
            int start = i;
            // 判断尾数够不够k个,来决定end指针的位置
            // start + k就是一个k的区间,其实条件就是最后不管剩多少都翻转前k个
            // 就是,i是一整个2k大小的块来移动的,所以最后肯定剩一个不到2k大小的块,不管是哪个条件,
            // 他都是翻转前k个,然后翻转完以后这个for循环就跳出去了,正好也满足了题目中的条件2
            int end = Math.min(ch.length - 1,start + k -1);
            while (start < end) {
                char temp = ch[start];
                ch[start] = ch[end];
                ch[end] = temp;
                start++;
                end--;
            }
        }
        return new String(ch);
    }
}

卡玛网54.替换数字

题目链接:54. 替换数字(第八期模拟笔试)

自己想法是循环找到所有数字在的下标,然后存在一个数组里,通过split方法和append方法来每次去掉数字并且拼上number,但是做着做着就寄了,因为不会用。

实际做法很简单,就是先找出有几个数组,然后把数组扩容一下,然后从后往前的去放字符,遇到数字就倒着放一个“number”然后i-5就行,看这个链接中的图,然后看我下面代码中的注释很轻松的就可以理解:替换数字 | 代码随想录

public class Solution {

    public static String replaceNumber(String s) {
        int count = 0;
        int sOldSize = s.length();
        for (int i = 0; i < s.length(); i++) {
            // 数一下有几个数字
            if(Character.isDigit(s.charAt(i))) {
                count++;
            }
        }
        // 扩充字符串s的大小,也就是每个数字替换成“number”之后的大小
        char[] newS = new char[s.length() + count * 5];
        int sNewSize = newS.length;
        // 把原来的s放在这个新的更大的数组里
        System.arraycopy(s.toCharArray(),0,newS,0,sOldSize);
        // 从后往前把数字替换为“number”
        for (int i = sNewSize,j = sOldSize;j < i;j--,i--) {
            // 不是数字的就放到最后去
            if(!Character.isDigit(newS[j])) {
                newS[i] = newS[j];
            }else {
                newS[i] = 'r';
                newS[i - 1] = 'e';
                newS[i - 2] = 'b';
                newS[i - 3] = 'm';
                newS[i - 4] = 'u';
                newS[i - 5] = 'n';
                // 向左移动5位,因为是从右往左去列数的
                i -= 5;
            }
        }
        return new String(newS);
    }
}

标签:ch,int,反转,随想录,start,length,字符串,newS,2k
From: https://blog.csdn.net/m0_61579911/article/details/143906208

相关文章

  • 洛谷算法题P1307 [NOIP2011 普及组] 数字反转
    题目题目描述给定一个整数N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。输入格式一个整数N。输出格式一个整数,表示反转后的新数。样例#1样例输入#1123样例输......
  • 代码随想录:链表相交
    代码随想录:链表相交像做数学题一样,要挖掘出表象下的实际条件。比如这道题,链表在一段时间后相交,其实含义是两者的尾部是相同的,所以只需要将尾部对齐即可。/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListN......
  • Gzip压缩文件和压缩字符串,web接口应用
    Gzip压缩文件和压缩字符串,web接口应用1.压缩文件packagecom.example.core.mydemo.gzip;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.zip.GZIPInputStream;importjava.util.zip.GZIPOutputStream;/......
  • C语言第14节:字符函数和字符串函数
    1.字符分类函数C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含一个头文件是<ctype.h><ctype.h>头文件中的字符分类函数提供了一组用于检查单个字符特性的函数。这些函数接收一个字符(通常为int类型的char值),返回......
  • i春秋-GetFlag(md5加密,字符串比较绕过)
    练习平台地址竞赛中心题目描述 题目内容你好,单身狗,这是一个迷你文件管理器,你可以登录和下载文件,甚至得到旗帜 点击登录 发现capture需要满足条件substr(md5(captcha),0,6)=xxxxxx编写python脚本破解验证码importhashlibdefgetMd5(index):"""函......
  • 【Java】对象和JSON字符串之间的转换 全网最清晰!
    在Java中,将对象转换为JSON字符串通常使用一些流行的JSON库,如Jackson或Gson。这两个库都非常强大,支持将Java对象转换为JSON字符串,也支持反向操作。接下来我会介绍一个基于Jackson的工具类,它可以非常方便地实现Java对象和 JSON字符串之间的相互转换。1.引......
  • 代码随想录:删除链表的倒数第N个节点
    代码随想录:删除链表的倒数第N个节点链表题目如果想找当前节点的前n个节点的话,用双指针法。另外务必用虚头节点。/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*......
  • 代码随想录:两两交换链表中的节点
    代码随想录:两两交换链表中的节点链表题目务必用虚头节点,很多问题会变简单很多/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(......
  • 【算法】(简单题)1.数字字符串相乘
    #include<stdio.h>#include<stdlib.h>//包含malloc和free的头文件#include<string.h>//包含字符串相关操作的头文件//定义字符串乘法函数char*multiply(constchar*num1,constchar*num2){//定义结果字符串指针char*ans=NULL;longres......
  • 牛客15天刷题Day1_ZT6_小红的字符串构造
    ZT6小红的字符串构造这是题面构造思维思路不用想得很复杂可以看成一个匹配问题,每一个字符要和一个与自己不同得字符匹配,而且每一个字符都要匹配,每一个字符都要被匹配到我们可以先用一个集合统计有多少种字符\(set(s_1,s_2,s_3,\dotss_n)\),让所有字符都被匹配到,一种......