华为上机题目

1、求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。
/*************判断是否有相同部分*************/
int IsSameNumber(int data)
{
    char data_str[100];
    int len = 0;

    //转字符串
    while (data)
    {
        data_str[len] = data % 10 + ‘0‘;
        data /= 10;
        len++;
    }
    data_str[len] = ‘\0‘;
    
    //显示一下,倒序
    cout << data_str << endl;

    int i = 0;
    int j = 0;

    int cnt = 0;
    int cnt_last = 0;

    int remember_i = 0;
    int remember_j = 0;

    for (i = 0; i < len; i++)
    {
        for (j = i + 1; j < len; j++)
        {
            cnt_last = cnt;

            if (data_str[i] == data_str[j])  //相等计数
            {
                cnt++;
                i++;

                if (cnt >= 2 && (j - i + 1 >= cnt) )    //找到两个相同的,且不重叠
                {
                    return 1;
              }
            }

            if (cnt_last == 0 && cnt == 1)    //开始计数
            {
                remember_i = i ;
                remember_j = j ;
            }

            if (cnt_last == cnt && cnt !=0 )   //没有继续计数
            {
                i = remember_i - 1;
                j = remember_j;
                cnt_last = cnt = 0;
            }

        }
    }

    return 0;
}

 

求两个字符串的乘积,结果存到字符串中,例如字符串一中存的“657891”,字符串二中存的“521”
/*************判断乘积*************/
void Mul(string data)
{
    int answer = 1;
    int i = 0;

    char answer_str[100];

    for (auto ch : data)
    {
        answer *= ch - ‘0‘;
    }
    
    //乘法
    while (answer)
    {
        answer_str[i++] = answer % 10 + ‘0‘;
        answer /= 10;
    }
    answer_str[i] = ‘\0‘;
    //反向
    for (int j = 0; j < i / 2; j++)
    {
        int temp = answer_str[j];
        answer_str[j] = answer_str[i - j - 1];
        answer_str[i - j - 1] = temp;
    }
    cout << answer_str << endl;
}

 

删除子串,只要是原串中有相同的子串就删掉,不管有多少个
void Delete(string string_small, string string_big)
{
    int i = 0;
    int j = 0;
    int j_last = 0;
    int k = 0;

    int remember_i = 0;
    int remember_j = 0;
    int remember_k = 0;

    char return_string[100];

    for (i = 0; string_big[i] != ‘\0‘; i++,k++)    //用大的字符串
    {
        return_string[k] = string_big[i];      //先搬进去

        j_last = j;

        if (string_big[i] == string_small[j])   //有相等的
        {
            j++;    //计数

            if (j_last == 0 && j == 1)   //第一次出现,记录i的初始值,以及k的初始值
            {
                remember_i = i;
                remember_k = k;
            }

        }

        if (string_small[j] == ‘\0‘)       //字符串用完了,返回去掉那个字符串,j清零。
        {
            k = remember_k - 1;
            j = 0;
        }

        if (j_last != 0 && j_last == j)    //中途断掉,i回退,j清零,k回退
        {
            i = remember_i;
            k = remember_k;
            j = 0;
        }

    }
    return_string[k] = ‘\0‘;

    cout << return_string << endl;
}

 

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序
比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数 第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成,输出数值出列顺序为:2,3,1,4。
void Val(void)
{
    int num[Length] = { 3,1,2,4 };

    int max = 7;

    int len = Length;
    int i = 0;
    int cnt = 0;

    while (len)
    {
        while (!num[i])   i++;     //跳过零

        cnt++;

        if (cnt == max)   //数到了之后
        {
            cnt = 0;
            max = num[i];
            cout << max << " ";
            num[i] = 0;
            len -= 1;
        }

        //报数
        i++;
        if (i >= Length)  i = 0;

    }

}

 

 

10.简单的四则运算
问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 1、表达式只含 +, -, *, /, (, ), 四则运算符
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
#define Length 4

int Identify_Grade(char ch)
{
    switch (ch)
    {
    case ‘+‘:return 1;
    case ‘-‘:return 1;
    case ‘*‘:return 2;
    case ‘/‘:return 2;
    case ‘(‘:return 3;
    case ‘)‘:return 0;
    case ‘=‘:return 0;
    }
}

int Calculate(int val1, int val2 , char ch)
{
    switch (ch)
    {
    case ‘+‘:return val1 + val2;
    case ‘-‘:return val1 - val2;
    case ‘*‘:return val1 * val2;
    case ‘/‘:return val1 / val2;
    }
}

void SimpleDeal(void)
{
    char express[20];
    cin >> express;

    int data_stack[20] ;
    int data_stack_pointer = 0;
    char symbol_stack[20] ;
    int  symbol_stack_pointer = 0;

    for (int i = 0; express[i] != ‘\0‘; i++)
    {
        //数字存入数字堆栈
        if (express[i] >= ‘0‘&&express[i] <= ‘9‘)
        {
            data_stack[data_stack_pointer++] = express[i] - ‘0‘;
        }

        //否则入字符堆栈
        else
        {
            while (symbol_stack_pointer > 0
                && Identify_Grade(express[i]) <= Identify_Grade(symbol_stack[symbol_stack_pointer - 1]))   //优先级大的先算
            {
                if (symbol_stack[symbol_stack_pointer - 1] == ‘(‘)   //有左括号
                {
                    if (express[i] == ‘)‘)   //是右括号,去掉一对括号
                    {
                        symbol_stack_pointer--;
                    }

                    break;
                }

                char sym = symbol_stack[--symbol_stack_pointer]; //取运算符

                if (sym == ‘(‘) //左括号,直接退出
                {
                    break;
                }

                //取出数字
                int val2 = data_stack[--data_stack_pointer];
                int val1 = data_stack[--data_stack_pointer];

                //计算答案
                data_stack[data_stack_pointer++] = Calculate(val1, val2, sym);
            }

            //符号入堆栈
            if(express[i] != ‘)‘ )
                symbol_stack[symbol_stack_pointer++] = express[i];

        }
    }

    cout << data_stack[0] << endl;

}
时间: 2024-08-27 19:31:40

华为上机题目的相关文章

华为上机练习题--统计各小写字符出现的次数

题目: 手动输入一个字符串,仅限小写字母,统计并输出每个字符在字符串中出现的次数,并输出.提示可以用map 例子:输入:aaabbbccc 输出:a 3 b 3 c 3 分析: 看到后面的提示,简直就是不用动脑,直接简单粗暴的顺势而上 直接上代码: import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TestCharAcount

华为上机试题

一.题目描述:通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉.比如字符串“abacacde”过滤结果为“abcde”. public String stringFilter(String str) { Map<String, Integer> map = new LinkedHashMap<String, Integer>(); String s = ""; for(int i=0

华为上机练习题--计算表达式

题目: 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形. 例如:  输入:3+8×2/9-2 输出:2 函数原型 public int getMyRet(String str) 分析: 这个题目略显高端啊, 像我这种非专业的自学者,还真没有学过编译原理之类的课程, 要自己实现一个这种小型的编译器是非常困难啊, 所幸的是这个题目是用java来实现的, 而我本身也曾经看到过用java来实现这类的问题, 这类问题有一种方法就是实现类编译器功能的函数, 这个我是驾驭不

华为上机练习题--重复字符过滤

题目: 请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉. 比如字符串"abacacde"过滤结果为"abcde". 示例 输入:"deefd"        输出:"def" 输入:"afafafaf"     输出:"af" 输入:"pppppppp"     输出:"p" 分析: 看到这种类似的相同字符过滤,使

华为上机练习题--括号匹配检测

题目: 输入一串字符串,其中有普通的字符与括号组成(包括'('.')'.'[',']'),要求验证括号是否匹配,如果匹配则输出0.否则输出1. Smple input:dfa(sdf)df[dfds(dfd)]    Smple outPut:0 分析: 类似于括号字符匹配这类的问题, 我们可以模拟栈的操作来进行验证, 这样问题就简单了, 就是栈的操作 代码如下: package com.wenj.test; import java.util.ArrayList; import java.uti

华为上机题汇总(六)

华为上机题汇总(六) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总六 目录 第二十六题 第二十七题 第二十八题 第二十九题 第三十题 第二十六题 26.一副牌中发五张扑克牌给你:让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色)2:三条带 一对 3:三条带两张不相同数值的牌 4:两对 5:顺子 包括 10,J,Q,K,A 6:什么都不是 7:只有一对 #include <iostream> #include <

华为上机题汇总(十三)

华为上机题汇总(十三) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十三 目录 第六十一题 第六十二题 第六十三题 第六十四题 第六十五题 第六十一题 61.给一个数组,输出数组里超出所有元素平均值的元素的个数.比如:1.2.3.4.5,输出3. #include <iostream> using namespace std; int overAvg(int a[],int n){ int sum = 0, count = 0; for (int i

华为上机练习题--将英文号码翻译成数字号码

题目: * 将 电话号码 one two ...nine zero 翻译成1  2 ..9 0 * * 中间会有double * * 例如 *     输入:OneTwoThree *     输出:123 *     输入:OneTwoDoubleTwo *     输出:1222 *     输入:1Two2 *     输出:ERROR *     输入:DoubleDoubleTwo *     输出:ERROR 分析:对于字符串的操作有一个比较好用的方法就是replaceAll(),有

华为上机练习题--按身高找出最佳二人组

题目: 要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高. Smple input:161 189 167 172 188 Sample outPut: 188 189 分析:我的理解就是先逆序排好数值, 然后逐对比较身高差值, 找出身高差值最小的然后输出 代码如下: package com.wenj.test; /** * 要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-