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

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

相关文章

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI