【算法】-- 【实现字符串的反转、判断两个字符串是否由相同的字符组成、删除重复的字符、统计字符串由多少个单词、按要求打印数组排列情况、输出字符串所有组合】

直击高频编程考点:字符串知识及经典算法题总结 字符串相关基本练习题总结(最长公共子串、最长回文子串、最长无重复字符子串、最小覆盖子串、字符串相乘、中文数字表达转实际数字格式等) 阅读详情

01 如何实现字符串的反转

例如:“I love you"反转后"you love I”
思路:第一次对整个字符串中的字符进行反转,然后对每个单词进行反转

public void swap(char [] cArr,int begin,int end){

        while (begin<end){
            char tmp=cArr[begin];
            cArr[begin]=cArr[end];
            cArr[end]=tmp;
            begin++;
            end--;
        }
    }

    public String swapWords(String s){
        char[] cArr= s.toCharArray();
        //对整个字符串进行字符反转操作
        swap(cArr,0,cArr.length-1);
        int begin=0;
        //对每个单词进行字符反转操作
        for (int i=1;i<cArr.length;i++){
            if (Character.isSpace(cArr[i])){
                swap(cArr,begin,i-1);
                begin=i+1;
            }
        }
        swap(cArr,begin,cArr.length-1);
        return new String(cArr);
    }

    public static void main(String[] args) {
        String s ="I Love You";
        System.out.println(new Swap().swapWords(s));
    }

02 如何判断两个字符串是否由相同的字符组成

问题描述:由相同的字符组成是指组成两个字符串的字符以及各个字符的个数是一样的。只是排列顺序不同而已,例如:“aaaabbc”与“abcbaaa” 就由相同的字符组成。
方法一:排序法
就是对两个字符串中的字符进行排序,比较两个排序后的字符串是否相等。若相等,则表明它们由相同的字符组成,否则,表明它们由不同的字符组成

 public static void compare(String s1,String s2){
        byte[] b1=s1.getBytes();
        byte[] b2=s2.getBytes();

        Arrays.sort(b1);
        Arrays.sort(b2);

        s1=new String(b1);
        s2=new String(b2);

        if (s1.equals(s2)){
            System.out.println("两个字符串相等");
        }else
            System.out.println("两个字符串不相等");
    }

 public static void main(String[] args) {
        String s1 ="aaaabbc";
        String s2 ="bbcaaaa";

        compare(s1,s2);
        s1="abcddddd";
        s2="abcddddb";
        compare(s1,s2);
    }

方法二:空间换时间
假设字符串中只是用ASCII字符,由于ASCII字符共有266个(对应的编码为0~255),在实现时可以通过申请大小为266的数组来记录各个字符出现的个数,并初始化为0,然后遍历第一个字符串,将字符串中字符对应的ASCII码值作为数组下标,把对应的元素加1,然后遍历第二个字符串,把数组中对应的元素值-1.如果最后数组中各个元素的值都为0,说明这两个字符串是右相同的字符组成;否则,说明这两个字符串是由不同的字符组成。

 public static void compare1(String s1,String s2){
        byte[] b1=s1.getBytes();
        byte[] b2=s2.getBytes();
        int[] bCount = new int[256];
        for(int i=0;i<s1.length();i++){
            bCount[b1[i]]++;
            bCount[b2[i]]--;
        }
        for(int i:bCount){
            if(i!=0) {
                System.out.println("两个字符串不相等");
                return;
            }

        }
        System.out.println("两个字符串相等");
    }


    public static void main(String[] args) {
        String s1 ="aaaabbc";
        String s2 ="bbcaaaa";

        compare1(s1,s2);
        s1="abcddddd";
        s2="abcddddb";
        compare1(s1,s2);
    }

03 如何删除字符串中重复的字符

方法一:蛮力法
把字符串看做一个字符数组,对它进行双重循环遍历,如果发现有重复的字符,就把字符置换成 ‘\0’,然后把所有‘\0’去掉

  public static  String removeDuplicate(String str){
        char [] c=str.toCharArray();
        int len=c.length;
        for (int i=0;i<len;i++){
            if (c[i]=='\0')
                continue;
            for (int j=i+1;j<len;j++){
                if (c[j]=='\0')
                    continue;
                //把重复的字符置为\0
                if(c[i]==c[j])
                    c[j]='\0';
            }
        }
        int l=0;
        int b[]=new int[len];
        for (int i=0;i<len;i++){
            if (c[i]!='\0')
                b[l++]=c[i];

        }
        return new String(b,0,l);
    }

 public static void main(String[] args) {
        String str="good morning";
        System.out.println(removeDuplicate(str));
    }

方法二:空间换时间

public static String removeDuplicate1(String str){
        char[] c=str.toCharArray();
        int len =c.length;
        int[] flags = new int [8];//只需要8个32bit的int,8*32=256bit
        int i;
        for( i=0;i<len;i++){
            int index=(int)c[i]/32;
            int shift=(int)c[i]%32;
            if((flags[index]&(1<<shift))!=0)
                c[i]='\0';
            flags[index]|=(1<<shift);
        }

        int l=0;
        int b[]=new int[len];
        for (i=0;i<len;i++){
            if (c[i]!='\0')
                b[l++]=c[i];
        }
        return new String(b,0,len);
    }
 public static void main(String[] args) {
        String str="good morning";
        System.out.println(removeDuplicate1(str));
    }

方法三:正则表达式

  public static String reverse(String str){
        StringBuffer sb= new StringBuffer(str);
        sb=sb.reverse();
        return sb.toString();
    }

    public static String removeDuplicate2(String str){
        str=reverse(str);
        str=str.replaceAll("(?s)(.)(?=.*\\1)","");
        str=reverse(str);
        return str;
    }

    public static void main(String[] args) {
        String str="good morning";

        System.out.println(removeDuplicate2(str));
    }

04 如何统计一行字符中有多少个单词

 public static int wordCount(String s){
        int word=0;
        int count=0;
        for (int i=0;i<s.length();i++){
            if (Character.isSpace(s.charAt(i)))
                word=0;
            else if (word==0){
                word=1;
                count++;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        String str="I am SongChengZhi";
        System.out.println(wordCount(str));
    }

05 如何按要求但因数组的排列情况

问题描述:针对1、 2、 2、 3、 4、 5这6个数字,写一个函数,打印出所有不同的排列,例如:512234 、 215432等,要求4不能出现第三位,3和5不能相连

思路:可以把排列组合问题转换成熟悉的图遍历问题。可以把1、 2、 2、 3、 4、 5这6个点看做图的6个结点,对6个结点两两相连可以组成一个无向连通图,这6个数字对应的全排列等价于从这个图中各个结点出发深度遍历这个图所有可能路径所组成的数字集合。例如,从节点1出发的而所有遍历路径组成了以1开头的所有数字的组合。由于3和5不能相连,因此在构造图时使图中3和5对应的结点不连通就可以满足这个条件。对于4不能在第三位,可以在遍历结束后判断是否满足这个条件。

 private int[] numbers=new int[]{1,2,2,3,4,5};
    private int n=numbers.length;
    //用来标记图中节点是否被遍历过
    private boolean[] visited=new boolean[n];
    //图的二维数组表示
    private int[][]graph=new int[n][n];
    //数字的组合
    private String combination="";
    public Set<String> getAllCombinations(){
        //构造图
        buildGraph();
        //用来存放所有组合
        Set<String> set=new HashSet();
        //分别从不同的节点出发,深度遍历图
        for (int i=0;i<n;i++){
            this.depthFirstSearch(i,set);
        }
        return set;
    }

    private void buildGraph() {
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                if (i==j){
                    graph[i][j]=0;
                }else {
                    graph[i][j]=1;
                }
            }
        }
        //确保在遍历事3与5是不可达的
        graph[3][5]=0;
        graph[5][3]=0;
    }

    //对树从节点start位置开始进行深度遍历
    private void depthFirstSearch(int start, Set<String> set) {
        visited[start]=true;
        combination=combination+numbers[start];
        if (combination.length()==n){
            //4不出现在第三个位置
            if (combination.indexOf("4")!=2)
                set.add(combination);
        }
        for (int j=0;j<n;j++){
            if (graph[start][j]==1&&visited[j]==false)
                depthFirstSearch(j,set);
        }
        combination=combination.substring(0,combination.length()-1);
        visited[start]=false;
    }

    public static void main(String[] args) {
        AllCombinations all=new AllCombinations();
        Set<String> set =all.getAllCombinations();
        Iterator<String> it =set.iterator();
        while (it.hasNext()){
            String string =it.next();
            System.out.println(string);
        }
    }

06 如何输出字符串的所有组合

问题描述:假设字符串中的所有字符都不重复,如何输出字符串的所有组合,例如:输入abc,输出a ,b ,c ,ab ,ac ,bc ,abc,共七种组合。

方法一:递归法

 public static void combineRecursiveImpl(char[]c,int begin,int len,StringBuffer sb){
        if (len==0){
            System.out.print(sb+" ");
            return;
        }
        if (begin==c.length){
            return;
        }

        sb.append(c[begin]);
        combineRecursiveImpl(c,begin+1,len-1,sb);
        sb.deleteCharAt(sb.length()-1);
        combineRecursiveImpl(c,begin+1,len,sb);
    }

    public static void main(String[] args) {
        String s="abc";
        char[] c=s.toCharArray();
        StringBuffer sb = new StringBuffer("");
        int len=c.length;
        for (int i=1;i<=len;i++)
            combineRecursiveImpl(c,0,i,sb);

    }

方法二:构造二进制法

例如:001表示输出结果中不含字符a ,b 只含 c ,及输出结果为c ,而101 表示输出结果为ac。原题就是一个要求输出001到111 这2^n-1 个组合对应的字符串.

 public static void Combine(char[] c){
        if (c==null){
            return;
        }
        int len=c.length;
        boolean used[]=new boolean[len];
        char cache[]=new char[len];
        int result=len;
        while (true){
            int index=0;
            while(used[index]){
                used[index]=false;
                ++result;
                if (++index==len)
                    return;
            }
            used[index]=true;
            cache[--result]=c[index];
            System.out.print(new String(cache).substring(result)+" ");
        }
    }

    public static void main(String[] args) {
        String s="abc";
        char[] c=s.toCharArray();
        Combine(c);
    }
剑指offer所有编程练习总结分析 给出剑指offer所有题目描述和对应的解题思路,并且在最有给出对应的代码展示和测试内容 由于牛客剑指Offer题目经过整理和筛选,是面试备考的经典资源之一,因此它的重要性在面试准备过程中是很高的。做这些题目可以帮助面试者熟悉常见的面试题型、巩固基础知识、提升编程能力,为应对面试提供了很好的准备。然而,还需注意不仅仅局限于做题,理解背后的原理和思想同样重要,以便能够在面试时灵活运用和展示自己的能力。 阅读详情

相关推荐

使用C/C++实现字符串的反转

使用C/C++实现字符串的反转,不能使用系统函数

“玲珑杯”线上赛 Round #15 河南专场:F -- 咸鱼文章

F -- 咸鱼文章 Time Limit:1s Memory Limit:128MByte Submissions:418Solved:163 DESCRIPTION elttiL moT nwod eht teerts sllac ruo god " ehT peek god " . piZ si a peehs god . tuB nehw mo

温姑娘的博客 877

Java 判断两个字符串是否由相同的字符组成的实例

今天小编就为大家分享一篇Java 判断两个字符串是否由相同的字符组成的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

字符串方面的几道简单算法题

字符串问题,也是笔试面试的重头戏,可以考察很多方面,比如思路,比如基础的算法。温故而知新,今天整理了几道有关字符串的简单算法题,解法如下代码所示。不对之处,欢迎大家批评指正。 package CharacterString; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; imp

别让现实一步步侵吞你最初的梦想 3085

ZYNQ-Video out IP与Video Timing Controller IP协同工作模式解析

本文深入解析了ZYNQ平台上Video out IP与Video Timing Controller IP的协同工作模式,详细介绍了它们的架构、工作原理及配置要点。通过AXI4-Stream接口实现高效视频数据传输,并结合HDMI输出系统设计实践,为开发者提供了实用的调试技巧和性能优化建议。

redis7keeper的博客 637

陀螺仪与加速度计的姿态融合——互补滤波

本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。

小白白学电子 2万+

字符串与二叉树操作与其他总结

文章目录不使用比较运算求出两个数的最大值与最小值 不使用比较运算求出两个数的最大值与最小值 根据数学公式,我们知道最大值Max(a,b)=(a+b+| a-b|)/2,最小值Min(a,b)=(a+b-|a-b|)/2.,如果使用这种方法求最大最小值,当a和b的值非常大时,它们的和可能会发生数据溢出的情况.把a和b变为长整型(long)可避免溢出. public static long max(...

炎溟墨的博客 817

COMSOL仿真分析高压直流GIS/GIL绝缘性能优化

高压直流气体绝缘设备(GIS/GIL)的绝缘性能是保障电网可靠运行的关键。通过COMSOL Multiphysics多物理场仿真,可以深入分析气固界面电场分布与电荷积聚机理。该技术结合静电场、热场和电荷传输耦合计算,能准确模拟温度梯度对SF6气体与环氧树脂界面特性的影响。工程实践中,这类仿真可优化导体结构设计、改进绝缘材料配方,并建立电场-温度关联预警模型。特别是在80℃高温工况下,仿真显示界面电荷密度会显著增加23%,这对设备安全运行具有重要指导价值。

weixin_32075843的博客 192

字符串

目录 字符串反转 字符串含相同字符 删除重复字符 统计单词 按要求打印数组排列 字符串所有组合 1.字符串反转 public class 字符串反转 { public static String ReverseSentence(String str) { String[] chars=str.split(" "); ...

XMQ2006的博客 185

双通道中频信号数字下变频及相位差估计(FPGA)

双通道中频信号数字下变频及相位差估计实验 一、上框图(通俗易懂) 二、实验要求 1、 用点频信号模拟中频信号:中频信号由DDS1和DDS2产生。具体产生方法见第2点。 2、 DDS1和 DDS2:调用IPcore里的数字信号处理中的NCO模块,工作时钟为100MHz,数据率即为100MHz,DDS1和DDS2的频率为:(学号后三位+500)Khz+f0(可设为20MHz);输出为16位;DDS1...

qq_39809425的博客 6941

Android HDMI-CEC协议解析:从机顶盒到电视的无缝遥控联动

本文深入解析Android HDMI-CEC协议,实现机顶盒与电视间的无缝遥控联动。通过剖析设备角色、消息格式及核心操作码,并结合Android HdmiControlManager API实战,详细讲解如何实现电源同步、按键穿透及音量控制,最终解决多设备遥控繁琐的痛点,提升用户体验。

egg99的博客 974

Learn-Algorithms 面试字符串专题:回文、atoi、滑动窗口与双指针等高频算法题全解

字符串是算法面试中出现频率最高的考点之一,围绕它衍生出回文判断、字符统计、子串查找与删除、原地修改、排列组合等几十种经典题型。本文以 Learn-Algorithms 仓库中 9 Algorithms Job Interview/1 字符串.md 为主线,串联起该系列笔记 字符串-查找、字符串-删除、字符串-修改、字符串-排序,并结合仓库 codes/1 string 与 codes/5 arra

gitblog_01002的博客 165

软件工程期末知识点总结【超详细】

生命周期模型(过程模型):瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型。2、实体联系图:1、数据对象2、属性3、联系(1:1、1:N、M:N)3、语句覆盖 就是设计足够的调试用例,使得程序中的每个语句至少执行一次。 5、判定覆盖就是设计足够的测试用例,使得程序中每个判定的取“真”分支和取“假”分支至少都执行一次,判定覆盖又称分支覆盖 6、条件覆盖就是设计足够的测试用例,使得程序判定中的每个条件能获得各种可能的结果。7、软件开发时期通常分成4个阶段:总体设计、详细设计、编码和单元测试、综合测试。

这个人好有趣....hh 1万+

数据结构与算法(java)

一、链表 1.1基本操作 //单链表的数据结构 class Node { Node next=null; int data; public Node(int data) { this.data=data; } } //链表基本操作 class MyLinkedList{ Node head=null; //插入数据 public void addNode(int d) { Node newNode=new Node(d); if(head==null) { head=newN

qq_41535923的博客 917

DRV8711驱动器的各寄存器的介绍

drv8711驱动器

PCLintelligence的博客 1634

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 650

Java学习手册:数据结构与算法汇总

数据结构与算法程序题汇总如下:(不断更新中) 1、PAT(Basic Level)Practise-----1001 2、Java学习手册:(数据结构与算法-链表)如何实现单链表的增删操作? 3、Java学习手册:(数据结构与算法-链表)如何实现单链表排序? 4、Java学习手册:(数据结构与算法-链表)如何从链表中删除重复元素? 5、Java学习手册:(数据结构与算法-链表)如何找出单链表中的倒...

浩比的专栏 3248

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

常见算法题目总结

1、链表 反转链表 两数相加 2、栈 扁平化嵌套列表迭代器 逆波兰表达式求值 3、树 验证二叉树的前序序列化 二叉搜索树迭代器 二叉树的前序遍历 二叉树的锯齿型层次遍历 二叉树中序遍历迭代法 求二叉树某个结点的祖先 4、队列 简化路径 5、字符串 Z字型变换 6、字典 两数之和 解码方法 ...

bob的博客 836

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

算法题-hot100学习总结

针对于上题,本题采用一维数组(滚动数组);将二维数组压缩至一维,这里一维指的是将上一层dp[i-1]的值拷贝到dp[i]中;故递推公式:dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);3、初始化:对其可全部初始化为非负最小值;4、遍历顺序采用倒序遍历,正序会将前一个的物品价值重复使用,且遵循先遍历for物品再遍历for背包;

m0_69666329的博客 549

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

华为资深技术官整理出的“算法面试宝典”下载量已突破40W!不服都不行

总的来说,面试是有套路的,一面基础,二面架构,三面个人。最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友多的IP如何在大量的数据中找出不重复的整数如何在大量的数据中判断一个数是否存在如何查询最热门的查询串如何统计不同电话号码的个数如何从5亿个数中找出中位数如何按照 query 的频度排序总的来说,面试是有套路的,一面基础,二面架构,三面个人。最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友。

2401_85111725的博客 346

力扣字符串题核心套路:双指针、滑动窗口、哈希表与动态规划

字符串作为一类特殊的线性数据结构,本质上是有序可索引的字符数组,其问题解法常围绕双指针、滑动窗口、哈希表与动态规划等基础算法展开。利用字符集有限性可设计高效哈希统计,通过滑动窗口可灵活处理连续子串,而回文、匹配与编辑距离等问题则依赖中心扩展、KMP和二维DP等核心技巧。这些方法不仅具有O(n)或O(n^2)的时间复杂度优化价值,更广泛应用于文本处理、日志解析及规则匹配等工程场景。在LeetCode刷题和算法面试中,字符串题出现频率极高,掌握这些套路能显著提升解题效率。系统梳理力扣字符串题的高频考点,涵盖双指

weixin_34353714的博客 409

剑指offer答案Java版

文章目录1.二维数组找指定元素:2.在原数组的基础上空格换%203.从后往前输出链表4.前序中序构造二叉树:5.两个栈实现队列:6.从前往后算斐波那契数列f(n)7.跳台阶:8.依次可以从1步到n步:9.旋转数组的最小数字:10.机器人的运动范围:11.剪绳子f(n)的最大分段长度乘积:12.位运算,一个数减1与它求与运算,就相当于把这个数最右边的一个1变成0,统计二进制中有多少个1,就是求可以进...

qq_41558341的博客 2446

每天一个算法(简单)

此篇文章的目的是在于建立一个可以协同配合的工作流,我希望对于一个算法的理解包含以下内容:详尽的分析,程序的结构,代码。文章中包含前两个部分,然后在本地完成代码。编写代码是否需要再附上结构,很难说,我现在想的是只加上主干,再附上一个链接即可对于一个大数,直接处理往往是很复杂的。通常,使用因式分解对大数进行拆分,对每一个质因数进行处理自然数通常可以写成质因数相乘的形式模式识别:需要移动左右两头的问题可以考虑双指针题目:给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。

hands_up_down的博客 3528
上一篇: 【算法】-- 【计算两个有序整型数组的交集、判断一个数组中数值是否连续相邻、求解数组中反序对的个数、如何求解最小三元组距离】
下一篇: 【算法】-- 【二叉树的实现、层序遍历二叉树、已知先序中序遍历二叉树,求后序遍历二叉树、求二叉树中结点的最大距离】
春来桃花开
博客等级 码龄10年 21粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值