2014深圳华为机试剖析

题一:

(1)给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数;2.递减数中各位数之和最大的数)之和。
递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同的情况。最大递减数:所输入整数的所有递减数中值最大的一个。 如: 75345323,递减数有:75,753,53,53,532,32。那么最大的递减数为753。
各位数字之和最大的递减数: 如75345323中的各递减数:75各位数之和=12(7+5=12),753各位数之和=15(7+5+3=15),53各位数之和=8(5+3=8),532各位数之和=10(5+3+2=10),32各位数之和=5(3+2=5)。那么各位数字之和最大的递减数为753。输出结果=最大递减数+各位数之和最大的递减数。(1506=753+753)

实现代码如下【机试都是靠华为自己写的程序来判断是否正确的,所以一定要按照华为机试说明来,此次标明类名必须为Main】:

import java.util.ArrayList;
import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        //构造一个输入扫描对象
        Scanner scanner = new Scanner(System.in);
        //存储输入字符的变量
        String input_str = null;
        //字符串长度变量
        int str_size = 0;
        //输出的和
        int sum = 0;
        //新的字符。
        String newstr;
        //数组用来保存各个数值
        String[] array_str;
        //用来保存最大递减数
        int max_int = 0;
        //最大递减数之和。
        int max_sum = 0;
        //保存递减数
        ArrayList<String> list = new ArrayList<String>();

        while(true)
        {
            //通过用户输入获取一个字符串
            input_str = scanner.next();

            String reg = "^[-+]?[0-9]+(\\.[0-9]+)?$";
            //"^\\d+$"; 匹配正数
            //判断是否为数字
            boolean isNum = input_str.matches(reg);
            if(isNum)
            {
                //处理负数
                if(input_str.startsWith("-"))
                {
                    input_str = input_str.substring(1,input_str.length());
                }

                //把字符串长度赋给str_size变量
                str_size = input_str.length();

                array_str = new String[str_size];

                for(int i = 0;i < str_size;i++)
                {
                    array_str[i] = input_str.substring(i,i+1);
                }

                for(int i = 0;i < array_str.length;i++)
                {
                    newstr = new String();

                    for(int j = i;j < (array_str.length-1);j++)
                    {
                        if(Integer.parseInt(array_str[j]) > Integer.parseInt(array_str[j+1]))
                        {
                            if(j == i)
                            {
                                newstr += array_str[j]+array_str[j+1];
                            }else
                            {
                                newstr += array_str[j+1];
                            }

                            list.add(newstr);
                        }else
                        {
                            break;
                        }

                    }

                }
                //找出递增最大值,并算出各位数相加最大值。
                int number = 0;
                String str_num;
                int temp_sum = 0;
                int i_num=0;
                int max_num=0;
                for(int i = 0;i < list.size();i++)
                {
                    temp_sum = 0;
                    str_num = list.get(i);
                    number = Integer.parseInt(str_num);

                    if(number > max_int)
                    {
                        max_int = number;
                    }

                    for(int j = 0;j<str_num.length();j++)
                    {
                        i_num = Integer.parseInt(str_num.substring(j,j+1));
                        temp_sum += i_num;

                    }

                    if(temp_sum > max_num)
                    {
                        max_num = temp_sum;
                        max_sum = number;
                    }
                }

                System.out.println(max_sum+max_int);

            }else
            {
                //不是数字重新输入
                continue;
            }
        }
    }
}

题二:

(2)描述: 程序的规格说明要求:

1. 如果第一个字符不是#,则输出N;

2. 如果第一个字符是#,第二个字符不是数字,则输出M;

3. 如果第一个字符是#,例如#n012345则输出从第三个字符开始计算,第0到第n个之间所有字符,n等于3则输出0123,如果n超出长度范围则输出从第三个字符开始全部字符.

请实现上述描述的程序.

题目类别: 字符串

难度: 初级

分数: 60

运行时间限制: 10 Sec

内存限制: 200 MByte

阶段: 应聘考试

输入: 无限制

输出: N、M、对应字符串

样例输入: #3012345

样例输出: 0123

答案提示: 输入输出参数的获取方式

TCL:

gets stdin a
gets stdin b
puts -nonewline stdout  [expr $a+$b]
Perl:
$a=;
$b=;
print  $a+$b;
ruby:
import sys
a = raw_input()
b = raw_input()
sys.stdout.write(str(int(a)+int(b)))
python:
a=STDIN.gets
b=STDIN.gets
print a.to_i+b.to_i

实现代码如下【机试都是靠华为自己写的程序来判断是否正确的,所以一定要按照华为机试说明来,此次标明类名必须为Main】:

 

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
         //构造一个输入扫描对象
         Scanner scanner = new Scanner(System.in);
         //存储输入字符的变量
         String input_str = null;
         //用来保存第二个字符的变量
         String first_str = null;
         //字符串长度变量
         int str_size = 0;
         //输出的变量
         String out_str = null;
         //要截取的开始位置
         int start_index = 0;
         //要截取的结束位置
         int end_index = 0;
         //要截取的新长度
         int new_size=0;
         //新的字符。
         String newstr = null;
         while(true)
         {
             //通过用户输入获取一个字符串
             input_str = scanner.next();
             //把字符串长度赋给str_size变量
             str_size = input_str.length();
             //判断字符是否以#开头
             if(input_str.startsWith("#"))
             {

                 //为保证正常截取第二个字符,输入的字符串长度必须要大于1;
                 if(str_size>2)
                 {
                     //截取第二个字符
                     first_str = input_str.substring(1,2);
                     //通过正则判断是否为数字
                     String reg = "^\\d+$";
                     boolean isNum = first_str.matches(reg);
                     if(isNum)
                     {
                         //把字符型数值转化为int类型变量
                         int strToInt = Integer.valueOf(first_str);
                         //当第二个字符数值大于整个字符串长度时,为避免不出异常,
                         //字符串长度必须大于3
                         if(str_size >= 3)
                         {
                             newstr = input_str.substring(2,str_size);
                             new_size = newstr.length();

                             if((strToInt+1) > new_size)
                             {
                                 start_index = 0;
                                 end_index = new_size;
                             }else
                             {
                                 start_index = 0;
                                 end_index = (strToInt+1);
                            }

                         }

                         if(end_index > 0)
                         {
                             out_str = newstr.substring(start_index,end_index);
                             System.out.println(out_str);
                         }

                     }else
                     {
                         System.out.println("M");
                     }

                 }

             }else
             {
                 System.out.println("N");
             }

             //重新初始化变量
              input_str = null;
             first_str = null;
             str_size = 0;
             out_str = null;
             start_index = 0;
             end_index = 0;
             new_size=0;
             newstr = null;

         }
    }
}
时间: 2024-08-05 08:05:44

2014深圳华为机试剖析的相关文章

2014华为机试西安地区B组试题

2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生

华为机试—介绍、剖析、建议

一.华为机试介绍 1.大致介绍 时间:120分钟 环境:Visual Studio(去年是vs2005).Visual C++.VC 6.0.Eclipse(Java) 题量:共3题 初级题--60分--3组测试数据 中级题--100分--5组测试数据 高级题--160分--8组测试数据 注:初级题和中级题为必答题,高级题为附加题. 提交次数:每题最多5次 评判方式:按通过测试数据组数给分,每通过一组得20分 2.考试说明 这里有一个老版的机试考试说明,供大家参考: C/C++,JAVA机试流程

2014年6月6日--华为机试

准备了还有一段时间了,结果还是悲剧了,主要准备的是算法,结果华为机试更看重字符串的操作,这一块正好是自己的弱项,哎.不过还有时间,这几个月多刷刷题,多锻炼锻炼,加油吧. 机试一共考了三道题,两道简单点的,一道难题,难题考得是状态机,不知道是什么东西╮(╯▽╰)╭,简单的两题做的也不好,回来在重新做一下.   1.倒置英文句子中单词的字母顺序. hello, I am good.  ->  olleh, I ma doog. 这题其实不难,当时脑子有点纠结符号,所以没做出来,还有一点客观原因,平时

2014华为机试西安地区A组试题

2014华为机试西安地区A组试题 题目一.分苹果 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放. 1<=M<=10,1<=N<=10 例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法 输入 7 3 输出 8 题目分析: 这道题类似于整数划分的题目,这是很早的一道ACM的题目,主要思路就是考递归. ①当苹果数目或者篮子数目为1时候,就只有一种可能 ②当苹果数目小于篮子数目的时候,按照苹果数目来分配 ③当苹果数目大于篮子数目的时候,空一个盘子 + 先每个盘子放

[华为机试真题][2014]63.等式变换

题目 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立. 1 2 3 4 5 6 7 8 9 = X 比如: 12-34+5-67+89 = 5 1+23+4-5+6-7-8-9 = 5 请编写程序,统计满足输入整数的所有整数个数. 输入: 正整数,等式右边的数字 输出: 使该等式成立的个数 样例输入:5 样例输出:21 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 *

[华为机试真题][2014]64.实现两个合法时间相加

题目 描述: 给定两个合法的时间(格式固定:hh:mm:ss,时间合法,不用考虑其它情况),输入两个时间相加后的结果:注意,相加后的结果也必需是一个合法的时间: 附合法时间定义:小时在[00-23]之间,分钟和秒分别是在[00-59]之间: 运行时间限制: 无限制 内存限制: 无限制 输入: 时分秒格式的时间字符串,如00:00:00 输出: 时分秒格式的时间字符串,如00:00:00 样例输入: 00:00:00 00:00:01 样例输出: 00:00:01 答案提示: 建议将时间转换为秒数

[华为机试真题]66.单词搜索

题目 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * 来源:华为机试真题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector> #include <stack> #include

华为机试正式版(西安c/c++/java),今天下午去机试的题目,新鲜出炉了!

以下题目都是回忆的,题目都很简单, 大家有些基础就可以参加!(语言可以是c/c++,也可以是java的) 题目一(60分): 字符串操作, 将小写转换成大写, 将大写转化为小写, 数字的不做转换 例如, 输入:aBcD12 输出:AbCd12 题目二(100分): 将输入的字符串按照规定重新排序,如果字符串长度为奇数, 则中间的字符保持不变, 中间字符左侧降序排列, 右侧字符按照升序排列, 如果字符串长度为偶数,则左半侧字符降序排列,右半侧字符则按照升序排列 例如, 输入:ab5de 输出:ba

华为机试 --- 求最大三位数

题目:输入10位0-9数字,取其中三位不同数字组合,求组合出来的最大三位数. 如输入 1 2 3 4 5 6 7 8 9 0,组合出来987最大. 测试代码如下: #include <stdio.h> #include <stdlib.h> int IsSame(int *a, int num); int main() { int i=0; int j=0; int a[10]={0}; int input =0; int length =0; int temp=0; for (i