zoukankan      html  css  js  c++  java
  • 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;
                 
             }
        }
    }
  • 相关阅读:
    evernote100个做笔记的好方法
    平衡二叉树的调整模版
    晨间日记的奇迹
    hdu 2952 Counting Sheep
    hdu 1535 Invitation Cards
    poj 3259 Wormholes(spfa)
    poj 2263 Heavy Cargo(floyd)
    poj 3268 Silver Cow Party(SPFA)
    hdu 1690 Bus System
    hdu 3631 Shortest Path(Floyd)
  • 原文地址:https://www.cnblogs.com/luwenbin/p/4099574.html
Copyright © 2011-2022 走看看