2015华为机试

第一题(60分):

按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”

#include<iostream>
using namespace std;
void solve(char *str , int n , int len)
{
	int q=len/(n+1);//原字符串被分解的个数
	int i;int j;
	for(i=0;i<=q;i++)
	{
		if(len<=n)
		{
			for(j=0;j<len;j++)
				cout<<str[j];
			for(;j<n;j++)
				cout<<"0";
		}
		else
		{
			for(j=0;j<n;j++)
				cout<<str[j];
		        cout<<"    ";
			len=len-n;
		}
	}
}
int main(void)
{
    int i , m , n , len;
    char str[1000];
    cin>>m>>n;
    for(i = 0 ; i < m ; ++i)
    {
        scanf("%s" , str);
        len = strlen(str);
        solve(str , n , len);
	cout<<endl;
    }
    return 0;
} <span style="font-size:18px;color: rgb(51, 51, 51); font-family: Verdana; line-height: 26px;"> </span>

输入是一个只包含拼音的字符串,请输出对应的数字序列。转换关系如下:

描述:      拼音        yi  er  san  si  wu  liu  qi  ba  jiu

阿拉伯数字        1   2   3      4   5    6    7   8   9

输入字符只包含小写字母,所有字符都可以正好匹配

运行时间限制:无限制

内存限制:       无限制

输入:              一行字符串,长度小于1000

输出:              一行字符(数字)串

样例输入:       yiersansi

样例输出:       1234

#include<iostream>
using namespace std;  

void solve(char *str , int len)
{
    int i;
    for(i = 0 ; i < len ; )
    {
        switch(str[i])
        {
        case 'y':
            putchar('1');
            i += 2;
            break;
        case 'e':
            putchar('2');
            i += 2;
            break;
        case 's':
            if(str[i + 1] == 'a')
            {
                putchar('3');
                i += 3;
            }
            else
            {
                putchar('4');
                i += 2;
            }
            break;
        case 'w':
            putchar('5');
            i += 2;
            break;
        case 'l':
            putchar('6');
            i += 3;
            break;
        case 'q':
            putchar('7');
            i += 2;
            break;
        case 'b':
            putchar('8');
            i += 2;
            break;
        case 'j':
            putchar('9');
            i += 3;
            break;
        }
    }
    printf("\n");
}
int main(void)
{
    int len;
    char str[1000];
    while(scanf("%s" , str) != EOF)
    {
        len = strlen(str);
        solve(str , len);
    }
    return 0;
}  

去除重复字符并排序

运行时间限制:无限制

内容限制:       无限制

输入:              字符串

输出:              去除重复字符并排序的字符串

样例输入:       aabcdefff

样例输出:       abcdef

  1. #include<iostream>
  2. using namespace std;
  3. void solve(char *str , int len)
  4. {
  5. int i , hash[256];
  6. memset(hash , 0 , sizeof(hash));
  7. for(i = 0 ; i < len ; ++i)
  8. {
  9. if(0 == hash[str[i]])
  10. hash[str[i]] = 1;
  11. }
  12. for(i = 0 ; i < 256 ; ++i)
  13. {
  14. if(0 != hash[i])
  15. putchar(i);
  16. }
  17. printf("\n");
  18. }
  19. int main(void)
  20. {
  21. int len;
  22. char str[1000];
  23. while(scanf("%s" , str) != EOF)
  24. {
  25. len = strlen(str);
  26. solve(str , len);
  27. }
  28. return 0;
  29. }

华为模拟题:

输入一个数,如75345323,递减数有753,53,3,532,32等,其中最大的为753,

同时753的各位数相加(7+5+3=15)也是最大的,因此输出753+753=1506

例如

输入 75345323

输出 1506

分析:为防溢出,要用字符串来保存

#include<iostream>
using namespace std;
int Msum(char *b)
{
    int sum=0;
    int n=strlen(b);
    for(int i=0;i<n;i++)
    {
        sum=sum+b[i]-'0';
    }
    return sum;
}
int Tsum(char *str)
{
    int len=strlen(str);
	if(len==0)
		return 0;
	if(len==1)
		return 2*(str[0]-'0');
    int count =1;
    int begin=0;
    char *b=new char[len+1];
    int sum;
    int Max;
    int maxNo;
    int maxsum=0;
    memset(b,'\0',len+1);
    int i;
    int j=0;
    int *c=new int[len+1];
	memset(c,0,len+1);
    for(i=1;i<len;i++)
    {
        if((int)str[i]<(int)str[i-1])
        {
	    count=count+1;

	}
        else
        {
            begin=i-count;
            memcpy(b,str+begin,count);
            b[count]='\0';
            c[j]=atoi(b);
            sum=Msum(b);
            if(sum>maxsum)
            {
                maxsum=sum;
                Max=c[j];
            } 

	    j++;
            memset(b,'\0',len+1);
            i=j-1;
	    count=1;

        }
	if(i==len-1)
	{
		begin=i-count+1;
		memcpy(b,str+begin,count);
		b[count]='\0';
		c[j]=atoi(b);
		sum=Msum(b);
		if(sum>maxsum)
		{
			maxsum=sum;
			Max=c[j];
		} 

		j++;
		memset(b,'\0',len+1);

		i=j-1;
		count=1;
		}
    }
    maxNo=c[0];
    for(i=0;i<j;i++)
    {
        if(c[i]>maxNo)
        {
            maxNo=c[i];
        }

    }
    delete []b;
    delete []c;
    int SUM=Max+maxNo;
    return SUM;
}
int main()
{
    char str[100];
    cin>>str;
    int sum=Tsum(str);
    cout<<sum<<endl;
    return 0;
}
时间: 2024-11-13 01:48:42

2015华为机试的相关文章

2015华为机试——小明的筷子

题目描述: 小明是个马大哈,某天他到超市买了若干双筷子(n<20)筷子的长度不尽相同,他把全部筷子都放在购物袋里面拿回家,路上不小心漏了一根 请你用程序帮他找出是漏掉的筷子是多长的. 输入:  剩下的筷子数组,如:1, 2, 3, 2, 1, 3, 2 返回值:漏掉的筷子长度,如上述输入返回:2(当输入的筷子数据异常时返回-1,如:找不到漏掉的筷子) 解题思路:使用HashMap对筷子的种类与数量进行键值对匹配存储,当出现重复筷子时,对应的筷子数量+1,然后遍历一次HashMap,获取筷子的数量

2015华为机试——计算两个正整数的最大公约数和最小公倍数

题目描述: 接口说明 原型: long getMaxDivisor(long lFirstInput, long lSecondInput); 输入参数: int first: 第一个整数; int second: 第二个整数; 返回值: 最大公约数 long getMinMultiple(long lFirstInput, long lSecondInput); 输入参数: int first: 第一个整数; int second: 第二个整数; 返回值: 最小公倍数 解题思路:使用辗转相除法

2015华为机试——尼科彻斯定理

题目描述: 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和.m属于[1,100],超出范围则报错. 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19 解题思路:不难发现展开式从(n*n - n + 1)开始,步进2显示,共显示n个数. 代码如下: public static void main(String[] args) { Scanner sc=new Scanner(System.in); while (sc.hasNext()

2015华为机试—— 字符变换

题目描述: 输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V-Z, 则转换为对应小写字母的值减21.其他字符不变,输出转换后的字符串. 例如,对于字母A,则转换为小写字母f:若形参是字母W,则转换为小写字母b. 输入:字符串 输出:转换后的字符串 样例输入:Axs3mWss 样例输出:fxs3mbss 题目不难,直接看代码: public class char_Change { public static void main(String[] args) {

2015华为机试——整数分割

题目描述: 一个整数可以拆分为2的幂的和,例如: 7 = 1+ 2 + 4 7 = 1 + 2 + 2 + 2 7 = 1 + 1 + 1 + 4 7 = 1 + 1 + 1 + 2 + 2 7 = 1 + 1 + 1 + 1 + 1 + 2 7 = 1 + 1 + 1 + 1 + 1 + 1 + 1 总共有六种不同的拆分方式 再比如: 4可以拆分成: 4 = 4, 4 = 1+1+1+1, 4 = 2+2, 4 = 1+1+2. 用f(n)表示n的不同拆分的种数,例如f(7) = 6. 要求读

2015华为机试——高次方数的尾数

题目描述: 求解M的N次方的最后三位数(M,N均大于10). 接口说明 原型: int GetLast3DigitsOfMN(int M, int N); 输入参数: int M:M > 10 int N:N > 10 返回值: M的N次方的最后三位数 解题思路: 思路一:先求M的N次方,然后M^N%1000求最后三位数,但是M的N次方很有可能会溢出,导致输出结果异常或错误. 思路二:思路一不行的话,我们得找到他对应的等效方法,M每乘M就对1000求余,其最后三位数是等效的. 代码如下: pu

2015华为机试—— 整型数排序

要求:请实现对一整型数序列的排序操作. 需求: 1.对输入的整型数序列A,完成升序排列,将结果序列从B中输出.以整数值大小为关键字排序,即小数在前,大数在后. 2.当序列中存在多个同样大小的数时,输出序列中仅保留一个. 举例: 输入序列A:76,92,34,34,59,16,59,45 符合要求的输出序列B:16,34,45,59,76,92 约束: 1.输入的序列至少含有一个整型数,否则应该返回null: 2.输入序列中的整数值使用int类型: 接口说明 /******************

2015华为机试—— 输入整型数组和排序标识,对其元素按照升序或降序进行排序

接口说明 原型: void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag); 输入参数: Integer[] pIntegerArray:整型数组 int  iSortFlag:排序标识:0表示按升序,1表示按降序 输出参数: 无 返回值: void 这题比较简单,也没什么思路好说,直接看代码 代码如下: public final class Demo { // 功能:输入整型数组,对其元素按照升序或降序进行排序 // 输入:pI

2015华为机试—— 有效数字

题目背景 判断字符串是否是有效数字,是则返回0,不是则返回-1 接口 int NumType(String s) 举例 例如:输入的字符串是123.456,返回0 输入123a,返回-1 输入123.456d,返回0 解题思路:直接使用double类型的静态方法 代码如下: public class Demo { public int NumType(String s) { try { Double.parseDouble(s); return 0; } catch (Exception e)