方正面试的题-找出字符串最多的分解方法

2023-12-07 15:08

本文主要是介绍方正面试的题-找出字符串最多的分解方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*同学给我一道方正面试的题,让我看看,今天把它写了下,就算练练手吧,好久没写程序了,题目如下:
有长度m(>3)的字符串M,另有n个3个字符长度的子字符串,可以是重叠的,(如123,231,),
分解字符串M,搜索与子字符串一样的字符串个数,并找出最多的分解方法。
如:M:1231567890。子字符串:123,567
分解M:
方法1:123,156,7890  符合1个
方法2:231,567,890   符合2个
方法3:3。。。。。
所以方法2 最好,符合2个。*/

/*Author:shizhixin
Email:szhixin@gmail.com
Blog:http://blog.csdn.net/ShiZhixin
Data:Oct 29,2009
Note:程序没有错误检测措施,没有考虑时间和内存方面的优化问题*/

#include "stdafx.h"
#include <iostream>
using namespace std;

//查找n是否在数组a中,在返回true
bool IsInArray(int a[],int len,int n)
{
    for(int i=0;i<len;i++)
    {
        if(n==a[i])
        {
            return true;
        }
    }
    return false;
    
}

//比较两个字符串,如果相等(顺序可以不同)返回1
bool ComparStr(const char str1[],const char str2[])
{
    int i,j;
    int nFlag[3]={-1,-1,-1};
    for (i=0;i<3;i++)
        for (j=0;j<3;j++)
        {
            if (str1[i]==str2[j]&&nFlag[i]==-1&&!IsInArray(nFlag,3,j))
            {
                nFlag[i]=j;
            }        
        }
        if (nFlag[0]!=-1&&nFlag[1]!=-1&&nFlag[2]!=-1)
            return true;
        else
            return false;
}

//输出字符串,从nMethodPosition开始,每个三个字符输出个逗号
void Output(const char* strSrc,int nSrcLen,int nMethodPosition)
{
    cout<<"最多的分解方法为:"<<endl;
    for(int i=0;i<nMethodPosition;i++)
        cout<<*(strSrc+i);
    if (nMethodPosition!=0)
    {
        cout<<",";
    }

    int nCommaFlag=0;
    for (i=nMethodPosition;i<nSrcLen;i++)
    {    
        cout<<*(strSrc+i);
        nCommaFlag++;
        if (nCommaFlag%3==0&&i!=nSrcLen-1)
        {
            cout<<",";
        }                
    }
            cout<<endl;
}

//找字符串个数,并输出分解方法
//strSrc源字符串,nSrcLen源字符串长度
//strSub需匹配的子字符串,以逗号隔开,每个串中含三个字符
//nSubNum子字符串的个数
int FindStr(const char* strSrc,int nSrcLen,const char* strSub,int nSubNum)
{
    const char* pBase=strSrc;
    int nStrNum[3]={0};
    int i,j,k;
    for (i=0;i<3;i++)
        for (j=0;j<nSrcLen/3;j++)
            for (k=0;k<nSubNum;k++)
            {
                char str1[3];
                char str2[3];
                str1[0]=*(strSrc+i+j*3);
                str2[0]=*(strSub+4*k);
                
                str1[1]=*(strSrc+i+j*3+1);
                str2[1]=*(strSub+4*k+1);
                
                str1[2]=*(strSrc+i+j*3+2);
                str2[2]=*(strSub+4*k+2);
                if (ComparStr(str1,str2))
                {
                    nStrNum[i]++;
                }
            }
            
            int nMax=nStrNum[0];
            int nMethodPosition=0;
            for (i=0;i<3;i++)
            {
                if (nMax<nStrNum[i])
                {
                    nMax=nStrNum[i];
                    nMethodPosition=i;
                }
            }
            Output(strSrc,nSrcLen,nMethodPosition);
            return nMax;
}

int main(int argc, char* argv[])
{
    int m;
    cout<<"输入字符串的长度:"<<endl;
    cin>>m;
    char* pM=new char[m+1];
    cout<<"输入字符串(注意为"<<m<<"个字符):"<<endl;//程序没有检测措施
    cin>>pM;
    pM[m]='/0';
    int n;
    cout<<"输入子字符串(每个串含3个字符)的个数:"<<endl;
    cin>>n;
       char* pN=new char[3*n+n-1+1];//3n字符数,n-1逗号数,1 /0
    cout<<"输入含三个字符的"<<n<<"个子字符串,之间用逗号隔开:"<<endl;
    cin>>pN; //输入时以逗号隔开
    pN[3*n+n-1]='/0';
    int nFindNum=FindStr(pM,m,pN,n);
    cout<<"符合的有"<<nFindNum<<"个"<<endl;
    cout<<endl;
     delete[] pM;
     delete[] pN;
    return 0;
}

这篇关于方正面试的题-找出字符串最多的分解方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/466330

相关文章

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方