字符串的算法题目-字符串

news2024/12/28 18:52:02

题目一:

描述
对于一个长度为 n 字符串,我们需要对它做一些变形。

首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

比如"Hello World"变形后就变成了"wORLD hELLO"。

数据范围: 1\le n \le 10^61≤n≤10
6
, 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度 O(n)O(n) , 时间复杂度 O(n)O(n)

思路:

在这里插入图片描述

需要用到的知识点:

Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回子字符串数组
将一个字符串分割为子字符串,然后将结果作为字符串数组返回。

注意事项
在java.lang包中有String.split()方法,返回是一个数组。

使用时要注意参数如果是特殊符号的话要进行转义。

1、“.”和“|”都是转义字符,必须得加"“;
  如果用“.”作为分隔的话,必须是如下写法:
String.split(”.“),这样才能正确的分隔开,不能用String.split(”.“);
如果用“|”作为分隔的话,必须是如下写法:
String.split(”|“),这样才能正确的分隔开,不能用String.split(”|");

2、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acount=? and uu =? or n=?”,把三个都分隔出来,可以用
  String.split(“and|or”);

3、public String[] split(String regex,int limit)根据匹配给定的正则表达式来拆分此字符串。
  此方法返回的数组包含此字符串的每个子字符串,这些子字符串由另一个匹配给定的表达式的子字符串终止或由字符串结束来终止。数组中
  的子字符串按它们在此字符串中的顺序排列。如果表达式不匹配输入的任何部分,则结果数组只具有一个元素,即此字符串。

方法一:

package com.company.day01;
/*
题目要求:
* 输入字符串:
"This is a sample",16

返回值:
"SAMPLE A IS tHIS"*/
public class Solution1 {
    public static void main(String[] args) {
        Solution1 solution1 = new Solution1();
        String res = solution1.trans("This is a sample", 16);
        System.out.println(res);
    }

    /**
     *
     * @param s
     * @param n
     * @return
     */
    public String trans(String s, int n) {
        //第一步:先做容易的大小写转换,所有下小写颠倒
        if(n == 0)
            return s;

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < n; i++) {
            //如果是大写
            if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'){
                //stringBuilder用于将转换后的字母串起来
                stringBuilder.append( (char)(s.charAt(i) + 32) );
            }else if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z'){
                stringBuilder.append( (char)(s.charAt(i)-32) );
            }else {
                stringBuilder.append(s.charAt(i));//串空格
            }
        }
        //stringBuilder存的是大小写转换后的字符串
        //第二步:整个字符串反转
        StringBuilder reverse = stringBuilder.reverse(); //ELPMAS ---
        //第三步:每一个单词内部进行反转
        for (int i = 0; i < n; i++) {
            int j = i; //j指针 从 i位置开始遍历
            while(j <n && reverse.charAt(j) != ' '){//j 指针右移,出了循环就证明标记处一个单词的结尾位置+1
                j++;
            }
            String tempWord = reverse.substring(i, j);//截取每一个单词
            StringBuffer bufferWord = new StringBuffer(tempWord);//每一个单词的StringBuffer
            reverse.replace(i, j, bufferWord.reverse().toString());//将反转后的单词替换掉原先的单词
            i = j; //i指针 跳跃到 j 位置并重合
        }
        return reverse.toString();
    }
}


方法二:

package com.company.day01;

import java.util.ArrayList;
import java.util.List;

/*
题目要求:
* 输入字符串:
"This is a sample",16

返回值:
"SAMPLE A IS tHIS"*/
public class Solut2 {
    public static void main(String[] args) {
        Solut2 solut2 = new Solut2();
        String this_is_a_sample = solut2.trans("nowcoder",8);
        System.out.println(this_is_a_sample);
    }

    /**
     *
     * @param s
     * @param n
     * @return
     */
    public String trans(String s, int n) {
        //第一步:利用str.split将字符串分割成字符数组
        String[] strings = s.split(" ");//将字符串分割成字符数组:
        //第二步:倒序取出字符串数组
        StringBuffer res = new StringBuffer();
        for (int i = strings.length-1; i >= 0; i--) {
            //System.out.println(strings[i]);
            //大小写转换
            StringBuffer stringWord = new StringBuffer(strings[i]);
            //遍历单词sample
            for (int j = 0; j < stringWord.length(); j++) {//遍历单词数组
                if(stringWord.charAt(j)>='A' && stringWord.charAt(j)<='Z'){
                    stringWord=stringWord.replace(j,j+1, 
                            String.valueOf((char) (stringWord.charAt(j) + 32)));
                }else if(stringWord.charAt(j)>='a' && stringWord.charAt(j)<='z'){
                    stringWord =stringWord.replace(j,j+1, 
                            String.valueOf((char) (stringWord.charAt(j)-32)));
                }else{
                    stringWord =stringWord.replace(j,j+1, " " );
                }
            }
            System.out.println("大小写后的:"+stringWord);
            res.append(stringWord).append(" ");
        }
        //去掉最后一个空格
        res.deleteCharAt(n);
        return res.toString();
    }
}

题目二:

描述
给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。

思路:

既然是公共前缀,那我们可以用一个字符串与其他字符串进行比较,从第一个字符开始,逐位比较,找到最长公共子串。

具体做法:

step 1:处理数组为空的特殊情况。
step 2:因为最长公共前缀的长度不会超过任何一个字符串的长度,因此我们逐位就以第一个字符串为标杆,遍历第一个字符串的所有位置,取出字符。
step 3:遍历数组中后续字符串,依次比较其他字符串中相应位置是否为刚刚取出的字符,如果是,循环继续,继续查找,如果不是或者长度不足,说明从第i位开始不同,前面的都是公共前缀。
step 4:如果遍历结束都相同,最长公共前缀最多为第一个字符串。
图示:
在这里插入图片描述

package com.company.day02;
import java.util.*;

public class Solution {
    /**
     *
     * @param strs string字符串一维数组
     * @return string字符串
     */
    public String longestCommonPrefix (String[] strs) {

        // write code here
        //第一步:处理空数组,返回空串,竖排数组
        int n = strs.length;
        if(n == 0)
            return "";
        //第二步:遍历第一个字符串的所有位置,取出字符
        //i代表第一个数组的下标,移动的方向是横向右移
        for (int i = 0; i < strs[0].length(); i++) {
            //j代表的数组的容量长度,j移动的方向是向下纵向移动
            for (int j = 1; j < n; j++) {
                //必须先判断长度不足的,然后判断字符不等的
                //条件1:数组中第二个字符串长度刚好等于i 下标,,则证明第二个字符串结束了
                //条件2: 数组中第二个字符串 i 位置的字符和标杆字符串i位置字符不相等
                if(strs[j].length()==i  ||  
                strs[0].charAt(i)!= strs[j].charAt(i) )
                    return strs[0].substring(0,i);//返回到i的截取字符串
            }
        }
        //比较完毕
        return strs[0];
    }

    public static void main(String[] args) {
        //["abca","abc","abca","abc","abcc"]
        Solution solution = new Solution();
        String[] strings = new String[]{"abca","abc","abca","abc","abcc"};

        String s = solution.longestCommonPrefix(strings);
        System.out.println(s);
    }
}

方法二:

在这里插入图片描述

import java.util.*;
 
public class Solution {
     //找出两个字符串的最长公共前缀
    public String twoLLongestCommonPrefix (String str1,String str2){   
     //找出短的字符串长度
        int length=str1.length()>str2.length()?str2.length():str1.length();   
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<length;i++){    //相同的提取出来,遇到不同的直接结束循环
            if(str1.charAt(i)==str2.charAt(i)){
                sb.append(str1.charAt(i));
            }else{
                break;
            }
        }
        String str=sb.toString();
        return str;
    }
    
    
    public String longestCommonPrefix (String[] strs) {
        if(strs.length==0){
            return "";
        }
        for(int i=0;i<strs.length-1;i++){
         //找出两个字符串的最长公共前缀
            String str=twoLLongestCommonPrefix(strs[i],strs[i+1]);   
            strs[i+1]=str;    //用找出的字符串再与下一个字符串找
        }
        return strs[strs.length-1];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】数组中值得说的那些事

文章目录前言一、数组的创建及初始化&#x1f333;1、数组的创建&#x1f333;2、数组的初始化&#x1f351;&#xff08;1&#xff09;动态初始化&#x1f351;&#xff08;2&#xff09;静态初始化二、数组的使用&#x1f333;1、数组中元素访问&#x1f333;2、遍历数组&…

力扣LeatCode算法题-两数之和(二)

力扣算法题第二题&#xff0c;两数相加算法题&#xff1a; 要求&#xff1a; //给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 //如果&#xff0c;我们将这两个数…

企业使用有线和5G主备双链路上网配置案例

场景介绍 典型的企业分支通常还是采用有线链路作为主链路&#xff0c;例如以太链路、MPLS专线等。为了提升分支站点的可靠性&#xff0c;企业一般都会部署两条上行链路&#xff0c;一条为主链路&#xff0c;一条为备链路。如果两条上行链路都采用有线&#xff0c;成本会比较高&…

JVM StringTable

文章目录学习资料StringTableString的基本特性String的内存分配StringTable为什么要调整&#xff1f;String的基本操作字符串拼接操作拼接操作与append操作的效率对比intern()的使用学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Ja…

prometheus exporter 监控主机

前提要求部署Grafana 前言 有许多库和服务器可以帮助将第三方系统中的现有指标导出为Prometheus指标。在无法直接使用Prometheus度量(例如&#xff0c;HAProxy或Linux系统统计数据)对给定系统进行检测的情况下&#xff0c;这是非常有用的。 node-exporter Linux操作系统采集&…

【Hack The Box】windows练习-- Scrambled

HTB 学习笔记 【Hack The Box】windows练习-- Scrambled &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &…

第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

文章目录5.4 接口开发-根据id删除附件5.4.1 接口文档5.4.2 代码实现5.4.3 接口测试5.4.4 测试ALI和FAST_DFS以及MINIO上传和删除的接口5.4.4.1 阿里云OSS上传和删除5.4.4.2 FastDFS上传和删除5.4.4.3 Minio上传和删除5.5 接口开发-根据业务类型/业务id删除附件5.5.1 接口文档5.…

[附源码]SSM计算机毕业设计成都团结石材城商家协作系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

力扣(LeetCode)6. Z 字形变换(C++)

数学构造 ZZZ 字形变换类似情报加密。找规律解密&#xff0c;就能得到构造的方法。 第 000 行相邻的数&#xff0c;取 n4n4n4 如上图&#xff0c;观察第 000 行和第 333 行 相邻的数&#xff0c;组成等差数列&#xff0c;公差 d62n−2d62n-2d62n−2 2n−22n-22n−2 是说 &…

【小程序】微信小程序云开发笔记详细教程(建议收藏)

1- 前言 1.1 微信云开发是什么&#xff1f; 微信云开发是微信团队联合腾讯云推出的专业的小程序开发服务。 开发者可以使用云开发快速开发小程序、小游戏、公众号网页等&#xff0c;并且原生打通微信开放能力。 开发者无需搭建服务器&#xff0c;可免鉴权直接使用平台提供的…

Spring Cloud | 实现Eureka Server 高可用服务注册中心全套解决方案

目录1、在搭建Eureka Server&#xff0c;配置高可用服务注册中心&#xff0c;配置3个Eureka Server:2、因为是在本地实现的话&#xff0c;需要在localhost加入三个服务&#xff0c;需要改变etc/hosts&#xff0c;linux系统通过vim /etc/hosts&#xff0c;3、如果是在测试或者是…

最优孤岛划分下含分布式电源配电网可靠性评估附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

小学生python游戏编程arcade----坦克大战(1)

小学生python游戏编程arcade----坦克大战&#xff08;1&#xff09;前言坦克类&#xff0c;地图&#xff0c;角色的控制&#xff0c;声音等前期学习的汇总1、坦克类2、title地图加载2.1设置&#xff0c;tank类的引入2.2 角色的引入2.3 效果图2.4 代码实现总结源码获取前言 接上…

kafka学习之基本概念

一、kafka常用基本概念 producer&#xff1a;生产者&#xff0c;生产并发送消息的一方。 consumer&#xff1a;消费者&#xff0c;接收消费消息的一方。 topic&#xff1a;一类消息的集合。在kafka中&#xff0c;消息以主题为单位进行归类&#xff0c;producer负责将消息发送…

云服务器 宝塔部署SpringBoot前后端分离项目

&#x1f986;博主介绍&#xff1a;小黄鸭技术 &#x1f308;擅长领域&#xff1a;Java、实用工具、运维 &#x1f440; 系列专栏&#xff1a;&#x1f4e2;开发工具 Java之路 八股文之路 &#x1f4e7;如果文章写作时有错误的地方&#xff0c;请各位大佬指正&#xff0c;一起进…

舆情监控究竟是什么?怎么运作的?

本文首发于&#xff1a;行者AI谛听 随着互联网的加速变化&#xff0c;舆论已成为影响国家政治、社会生活和公众情绪的重要因素&#xff0c;也是影响企业形象和长远发展的重要因素。能及时收集精准措施以及预防减少和消除舆论带来的影响&#xff0c;是行业长远发展的关键条件。下…

泰凌微蓝牙 HCI层事件的注册和使用

Controler HCI event是通过HCI将Controller所有的event报告给Host HCI event是按BLE Spec标准设计的&#xff0c;是BLE Controller和Host用来交互的事件&#xff1b;GAP event是BLE host定义的一些协议栈流程交互时间通知型事件。 HCI event类型 #define HCI_EVT_DISCONNEC…

【Hack The Box】windows练习-- Object

HTB 学习笔记 【Hack The Box】windows练习-- Object &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1…

链表oj题(第一弹)

通过前两篇博客我们了解了链表的实现&#xff0c;那么今天我们来看看链表的oj题是如何完成的。 1、移除链表元素 题目要求我们删掉与val相同的节点。 方法一&#xff1a;我们可以写一个循环&#xff0c;首先创建两个节点&#xff0c;一个头节点&#xff0c;一个尾节点&#x…

Jmeter常用函数__V和__intSum

文章目录一、__V详解1、作用2、示例二、__intSum详解1、作用2、示例三、示例--随机用户名四、示例--随机对应的用户名和密码一、__V详解 1、作用 执行变量表达式&#xff0c;并返回执行的结果可以执行嵌套函数 2、示例 1、固定值和随机数组合 ${__V(1.${__Random(1,10,)})}…