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

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

相关文章

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释