智乐软件笔试题目(三)【揭秘智乐软件笔试题】找出在字符串中找出第一个不重复的字符|| 找出最后一个重复的字符 (c/c++)

 

  本人做了点拓展,入门有字符不重复则得到第一个不重复的字符,如果所有字符否重复,则找出最后一个重复。

 

实现方法:

  1.定义一个int变量priority,记录出现重复的标志,其值越大,表示其对应出现重复情况的越晚,在程序中递加。

  2.动态开辟两个存储空间空间:one is int[LEN] ,the other is char[LEN],(程序中对应pi[LEN],pc[LEN]).

  3.检索源泉字符串,如果字符不存在pc中,将字符存入pc[i],同时在pi[i] = 1;//表示该字符出现且不重复。

    反之,如果字符第一次重复则设置priority递加;再次重复则不做处理。直到字符串扫描结束。

 4.找出pc[]中第一个不重复字符 或者最后重复的字符 。如果pi[]中有值=1,表示有字符不重负,如果没有,则表示

   所有字符都存在重复情况,找出最后重复的字母(即pi[i]值最大的下标所对应pc[i]的值)就是最终要返回的值。

   完毕,不多讲啦,因为在程序里面我已经做了很详细的注释啦!

 

 

程序代码:

//start code
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <assert.h>

//Constant
#define MAX 256
#define LIM 300

//fun
void  inputString(char* pstr);
char handleString(char* pstr);


using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
   
    char szstrSrc[MAX] = {""};
    char* pstrSrc =szstrSrc;
    char chresult;
   
    assert(pstrSrc!=NULL);

    /*输入字符串*/
    inputString(pstrSrc);
    cout<<"待测试字符串"<<pstrSrc<<" 长度:"<< strlen(pstrSrc)<< endl;

   //判断字符串合法性
    assert(strlen(szstrSrc)<=MAX && strlen(szstrSrc)> 0);

    /*输出结果*/
    chresult = handleString(szstrSrc);
    cout<<"第一个不重复的或最后重复的字符:"<<chresult<<endl;

    getchar();
    getchar();

    return 0;
}
// end code


void inputString(char* pstr)
{
  
    int i = 0;
    char szstrTemp[LIM]={""};


    /*输入操作*/
    cout<<"输入字符串,长度<=255:";
    cin>>szstrTemp;
    cout<<endl;

    while(strlen(szstrTemp)>MAX-1)
    {
        cout<<"字符超长,请重新输入:";
        cin>>szstrTemp;
        cout<<endl;
    }


    for (i=0;i<MAX;i++)
    {
        if (szstrTemp[i]=='/0')
        {
            break;
        }

        else
        {
            pstr[i] = szstrTemp[i];
        }
    }
}

/*处理字符串,获取结果字符*/
char handleString(char* pstr)
{

    int i = 0;
    int j = 0;
    char chtemp;

    /*
    //priority值越大表示其对应pc[i]出现重复情况越晚,
    其pc[priority(最大值)]即使本代码最终结果
    */
    static int priority = 1;
    int  resultIndex = 0;

    /*最大优先级别,如果每个字符都重复MaxPRIORITY值对
    应小标pc[MaxPRIORITY]未最终结果
    */
    int MaxPRIORITY =1 ;
    /*开辟临时空间*/
    int const LEN = strlen(pstr);
    char* pc = new char[LEN]; //记录字符(不重复)

    /*字符出现次数记录=0表示没有出现
    pi[i] = 0 //表示与其对应的pc[i] 没有字符出现;

    pi[i] = 1  //表示该字母在strSource字符串出现一次,出现的字母 = pc[i];

    pi[i]  >1  //表示重复的字母在源字符串strSource中出现2次或以上,
    多次出现只记录第一次,其值priority递加+1,—->
    -->同一个字母多次出现只第一次给它设置priority;
    */
    int* pi = new int [LEN];


    /*清零动态分配内存*/
    for (i=0;i<LEN;i++)
    {
        pc[i] = '/0';
        pi[i] = 0; //所有priority清零
    }


    /* 记录不重复字母和其出现的次数,pc,pi下标一一对应,
    比如pc[0] = a,pi[0]= a字母在strSource源字符串出现重复优先次数
    */
    for (i=0;i<LEN;i++)
    {
       
        //外循环:取出源字符串中字符
        for (j=0;j<LEN;j++)
        {
            /*内循环:取出源字符中字符与pc数组中(字符不重复)进行比较*/
            if (pc[j] == pstr[i])
            {
                if (pi[j]==1)
                {
                    /*该字符出现第二次,设置priority ID。
                    同一字符出现2次以上不执行此设置priority操作,
                    完成退出内循环,继续操作下一源字符
                    */
                    priority = priority + 1;
                    pi[j] = priority;
                }

                break;
               
            }
            else
            {  
                if (pc[j] == '/0')
                {
                    /*该字符未出现过,存入pc中,置位出现标志pi[j] = 1,
                    推出内循环,继续操作下一源字符
                    */
                    pc[j] = pstr[i];
                    pi[j] = 1;
                    break;
                }

            }
        }
    }



    /*输出处理后的结果*/
    cout<<"字符/t出现情况"<<endl;
    for (i=0; i<LEN; i++)
    {
        if (pc[i]!='/0')
        {
            cout<<pc[i]<<"/t"<<pi[i]<<endl;
        }
        else
        {
            break;
        }
    }


    /*挑选出最终结果输出结果*/
    for (i = 0;i<LEN;i++)
    {
        /*如果有字符最先只出现一次,其为最终结果字符,选到结果退出*/
        if (pi[i]!=0) //判断当前字符是否属无效字符,无效字符='/0',其pi[i] = 0
        {
            if (pi[i] == 1)
            {
                resultIndex = i;
                break;
            }

            else
            {
                /*pi[i]>1重复出现了2次或以上,记录及值是否是当前最大*/
                if (pi[i] > MaxPRIORITY)
                {
                    MaxPRIORITY = pi[i]; //记录其大值
                    resultIndex = i;    //存下其下标
                    continue;
                }

            }
        }

    }



    chtemp = pc[resultIndex];

    /*释放动态动态分配内存*/
    delete []pi;
    delete [] pc;

    return chtemp;
}

//end code

 

运行结果1:

有字符不重复的情况结果:

有字符不重复

 

 

 

所有字符都重复的情况结果:

所有字符都重复


以上我只测试了字母,字符串,数字加上特殊符号是没有问题的。

总结:

  以上实现仅仅是提供一种实现的方式和方法,该方法缺点是如果里面出现的字符很多的时候,并且有汉字出现时候,需要比较很多次,效率不是很高。

  如果仅仅是基本字符串(ASCII在0~128 之间)字符,应该是没有问题。

 所以期望各位路过者多留心,有更好的实现方法和建议请留下。


+++++再次重声下:此题目为智乐软件c++笔试题目,最后一题技术题+++++++

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值