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;
             
         }
    }
}
posted @ 2014-11-15 17:02  luwenbin  阅读(712)  评论(0编辑  收藏  举报