zoukankan      html  css  js  c++  java
  • 华为笔试题3

    一:给定一个字符串,寻找它的一个最大子字符串,该子字符串是回文。例如给定一个用例的字符串”gabcdcbaef”,那么最大回文
    字串是”abcdcba”
    函数声明为void huiwen(char input[], int len, char output[])

    #include <string>
    #include <iostream>
    using namespace std;
    
    
    //如果是回文字符串,那么从字符串的最中间向两头分别遍历,则应该都是相等的
    void huiwen(char input[],int len, char output[])
    {
        //start表示回文字串的起始位置
        int max=0,left=0,start=0;
        for(int i=1;i<len;i++)
        {
            for(int t=1;t<=i;++t)
            {
                if(i+t>len)//避免发生了越界访问
                    break;
                if(input[i-t]!=input[i+t])//从中间向两边遍历
                    break;
                else 
                    ++left;
            }
            //总回文数=2*left+1
            if(2*(left-1)+1>max)
            {
                max=2*left+1;
                start=i-left;//获取其起始地址
            }
            left=0;
        }
        memcpy(output,input+start,max);
    }
    
    int main()
    {
        char test[] = "gabcdcbaef";
        char OutData[100] = {'0'};
        huiwen(test,sizeof(test),OutData);
        for(int i = 0;i<sizeof(OutData);i++)
            if(OutData[i]!='0')
                cout<<OutData[i];
        getchar();
        return 0;
    }


     

    二:删除字符串中所有给定的子串

    问题描述: 在给定字符串中查找所有特定子串并删除,若是没有找到响应子串,则不作任何操作。要求实现函数:
    int delete_sub_str(const char *str, const char *sub_str, char *result_str)
    输入: str:输入的被操作字符串
    sub_str:需要查找并删除的特定子字符串
    输出: result_str:在str字符串中删除所有sub_str子字符串后的终局
    返回: 删除的子字符串的个数
    子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:在字符串"abababab"中,采用最左匹配子串"aba",
    可以匹配2个"aba"字串。若是匹配出从左到右位置2起头的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。输入字符串不会
    跨越100 Bytes,请不用考虑超长字符串的情况。
    示例
    输入:str = "abcde123abcd123"
    sub_str = "123"
    输出:result_str = "abcdeabcd"
    返回:2
    输入:str = "abcde123abcd123"
    sub_str = "1234"
    输出:result_str = "abcde123abcd123"
    返回:0

    #include <string>
    #include <iostream>
    using namespace std;
    
    
    int delete_sub_str(const char *str, const char *sub_str, char *result_str)
    {
    	int nlen=strlen(str);
    	int nSubLen=strlen(sub_str);//获取子串的长度
    	int cnt=0,index=0;
    	int j=0;
    	for(int i=0;i<nlen;++i)
    	{
    		for(j=0;j<nSubLen;j++)
    			if(str[i+j]!=sub_str[j])
    				break;
    		if(j>=nSubLen)
    		{
    			++cnt;
    			i=i+nSubLen-1;//删除子串
    		}
    		else
    		{
    			result_str[index++]=str[i];
    		}
    	}
    	result_str[index]='\0';
    	return cnt;
    }
    
    int main()
    {
    	string str = "abcde123abcd123";
    	string sub_str = "123";
    	char result_str [100] = {'0'};
    	delete_sub_str(str.c_str(),sub_str.c_str(),result_str);
    	cout<<result_str<<endl;
    	getchar();
    	return 0;
    }


     

    三:在计算机中,由于位宽限制,只能进行有限精度的十进制整数加减法,比如在32位宽计算机中,参与运算的操作数和结果必须
    在-231~231-1之间。若是需要进行更大规模的十进制整数加法,需要使用特殊的方法实现,比如使用字符串保存操作数和结果,采
    纳逐位运算的方式进行。如下:9876543210 + 1234567890 = ?,让字符串 num1="9876543210",字符串 num2="1234567890",结果
    保存在字符串 result = "11111111100"。-9876543210 + (-1234567890) = ?让字符串 num1="-9876543210",字符串 num2="-
    1234567890",终局保存在字符串 result = "-11111111100"。
    要求编程实现上述高精度的十进制加法。
    要求实现函数:
    void add (const char *num1, const char *num2, char *result)
    输入:num1:字符串形式操作数1,若是操作数为负,则num1[0]为符号位-
    num2:字符串形式操作数2,若是操作数为负,则num2[0]为符号位-
    输出:result:保存加法计较终局字符串,若是终局为负,则result[0]为符号位。
    当输入为正数时,+不会出今朝输入字符串中;当输入为负数时,-会出今朝输入字符串中,且必然在输入字符串最左边位置
    输入字符串所有位均代表有效数字,即不存在由0起头的输入字符串,比如"0012", "-0012"不会呈现;
    要求输出字符串所有位均为有效数字,终局为正或0时+不出今朝输出字符串,终局为负时输出字符串最左边位置为-。

    #include <string>
    #include <iostream>
    #include <stdlib.h>
    #include <map>
    using namespace std;
    
    map <char,int> char2int;
    map <int,char> int2char;
    void Init()
    {
    	for(int i = 0;i<10;i++)
    	{
    		char CData = (char)(i+48);
    		char2int[CData] = i;
    		int2char[i] = CData;
    	}
    }
    
    char * Reverse(const char *strStc,char*strDest)
    {
    	int nLen = strlen(strStc);
    	int i = 0;
    	for(nLen;0 <= nLen;nLen--)
    	{
    		strDest[i]= strStc[nLen-1];
    		i++;
    	}
    	strDest[i]='\0';
    	return strDest;
    }
    
    void add (const char *num1, const char *num2, char *result)
    {
    	int nLenNum1 = strlen(num1);
    	int nLenNum2 = strlen(num2);
    	char ReverseNum1 [100] ={'0'};
    	char ReverseNum2 [100] ={'0'};
    	char ReverseResult [100] = {'0'};
    	Reverse(num1,ReverseNum1);
    	Reverse(num2,ReverseNum2);
    	int nLen = nLenNum1 > nLenNum2 ? nLenNum1:nLenNum2;
    	for(int i=0;i<nLen;i++)
    	{
    		int nResult = char2int[ReverseNum1[i]] + char2int[ReverseNum2[i]] 
    		+ char2int[result[i]];
    		result[i] = int2char[nResult%10];
    		result[i+1] = int2char[nResult/10];
    	}
    	strcpy(ReverseResult,result);
    	Reverse(ReverseResult,result);
    
    }
    
    int main()
    {
    	Init();
    	char * num1="9876543210";
    	char * num2="1234567890";
    	char result [100] = {'0'};
    	add(num1,num2,result);
    	cout<<result<<endl;
    	getchar();
    	return 0;
    }


     

  • 相关阅读:
    ViewSwitcher使用范例
    TextSwitcher,译为文字转换器控件
    android开发中系统自带语音模块的使用
    android string.xml %问题
    Android动画解析--XML
    Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
    Android操作系统11种传感器介绍
    开发移动app与服务器端session的状态管理与交互
    android开发分辨率问题解决方案
    android获取手机录
  • 原文地址:https://www.cnblogs.com/byfei/p/3112383.html
Copyright © 2011-2022 走看看