华为java上机试题

1、实现两个大数的相加。如 222423523452345+ 245235234523452345452,不要使用java.math.BigInteger

public class Test6 {
	/**
	 * @param 大数相加
	 */
	
	public String add(String str1,String str2){
		int jinwei = 0;
		StringBuffer sb1 = new StringBuffer(str1); sb1.reverse();
		StringBuffer sb2 = new StringBuffer(str2); sb2.reverse();
		int len1=sb1.length(),len2=sb2.length(),minLen = (len1>len2)?len2:len1;
		
		StringBuffer sb = new StringBuffer("");
		for(int i=0;i<minLen;i++){
			int single =Integer.parseInt(sb1.charAt(i)+"")+Integer.parseInt(sb2.charAt(i)+"")+jinwei;
			sb.append(single%10);
			jinwei = single /10;
		}
		
		if(len1==len2){
			sb.append(jinwei);
			return sb.reverse().toString();
		
		}else if(len1>len2){
			
			for(int i=len2;i<len1;i++){
				int single =Integer.parseInt(sb1.charAt(i)+"")+jinwei;
				sb.append(single%10);
				jinwei = single /10;
			}
			sb.append(jinwei);
			return sb.reverse().toString();
		
		}else{
			
			for(int i=len1;i<len2;i++){
				int single =Integer.parseInt(sb2.charAt(i)+"")+jinwei;
				sb.append(single%10);
				jinwei = single /10;
			}
			sb.append(jinwei);
			return sb.reverse().toString();
		}
	}
	public static void main(String[] args) {
        Test6 test6 = new Test6();
        System.out.println(test6.add("123543534523452435243523452345243524352342345234523452", "9234523453245234523423452455234523452435341"));
	}
	
	

}

2、字符串单词的提取。

import java.util.regex.*;
public class Test5 {

	/**
	 * @param 将一个字符串中的单词提取出来
	 */
	
	public String getWords(String str,String reg){
		Pattern pat = Pattern.compile(reg);
		Matcher mat = pat.matcher(str);
		StringBuffer sb = new StringBuffer("") ;
		while(mat.find()){
			sb.append(mat.group(1)+",");
		}
		return sb.toString();
	}
	
	public static void main(String[] args) {    //   \b:单词的边界
		Test5 test5 = new Test5();
		System.out.println(test5.getWords("hello my name is 123swh!","\\b(\\w+)\\b"));
		
	}

}

3、求一个字符串中的最大回文字符串。

import java.util.Scanner;


public class Test4 {

	/**
	 * @param 求一个字符串中的最大回文字符串
	 */
	public boolean huiwen(String str){
		StringBuffer sb1 = new StringBuffer(str);
	    sb1.reverse();
	    return str.equals(sb1.toString());
	}
	
	//进行信息的定位
	public int[]  selectHuiwen(String str){
		int[] res = new int[3];
		int max=0,start=0,end=0;
		int len = str.length();
		for(int i=0;i<len;i++)
			for(int j= i+1;j<len;j++){
				if(huiwen(str.substring(i,j+1))){
					if((j-i+1)>max){
						start = i; 
						end =  j+1;
						max = j-i+1;
					}
				}
			}
		res[0] = max;res[1] = start;res[2] = end;
		return res;
	}
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        Test4 test4 = new Test4();
        System.out.println(str.substring(test4.selectHuiwen(str)[1], test4.selectHuiwen(str)[2]));
        
	}

}

4、分解因式。我直接使用递归的方法

import java.util.Scanner;


public class Test3 {
	/**
	 * @分解因式
	 */
    public static String fenjie(int num){
    	if(num == 1)
    		 return "1";
    	
    	for(int j=2;j<=num;j++)
    	{
    		if(num % j ==0)
    			 return j+"*"+fenjie(num/j);
    	}
    	 return null;
    }
	
	public static void main(String[] args) {
       
		Test3 test3 = new Test3();
		Scanner  scan = new Scanner(System.in);
		int inp = scan.nextInt();
		//System.out.println(scan.nextLine());
		System.out.println(test3.fenjie(inp));
	}

}



5、正则表达式的使用。将输入字符 122453234 中的3x5替换为-3x5- ,如 1234534,output: 12-345-34

import java.sql.Timestamp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class regexTest {
	
  
	public static void main(String args[])
	{
		  String string="12345673254";
		  System.out.println(regexTest.regexReplace("3(\\S{1})5", "-$0-", string));  
		  //其实这样就一步就可以了,但是使用了Pattern和Matcher就是为了熟悉正则表达式
		 // System.out.println(string.replaceAll("3(\\S{1})5", "-$1-"));  
	}
	
	
	public static String regexReplace(String regex,String repStr,String content)
	{
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(content);
		StringBuffer sb = new StringBuffer();
		boolean result = m.find();
		while(result){
			m.appendReplacement(sb, repStr);
			result = m.find();
		}
		m.appendTail(sb);
		return sb.toString();
	}
}


6、进制转换。这个就太简单了,以 2 和 10进制的互化为例子

public class Test7 {

	/**
	 * @param java进制转换
	 */
	public static void main(String[] args) {
	//like 2 -> 10
    String source1 = "1101000101000110111";
    int sum1 = 0,i= source1.length()-1;
    for(;i>=0;i--){
    	sum1 += Integer.parseInt(source1.charAt(i)+"")*(java.lang.Math.pow(2, source1.length()-i-1));   //注意方向
    }
    System.out.println("2进制 :"+Integer.toBinaryString(sum1)+" 其10进制为:"+sum1);
 		 
    //like 10 -> 2  相除求余法
    int source2 = sum1;
    StringBuffer sb = new StringBuffer("");
    while(source2!=1){
    	sb.append(source2 % 2);
    	source2 = source2/2;
    }
    sb.append(1);
    System.out.println("10进制:"+sum1+" 其2进制为:"+sb.reverse().toString());
    
 }

}


7、输入字符串长度,字符串,计数m。

import java.util.ArrayList;

public class Test9 {

	/**
	 * @param 
	 * 输入字符串长度,字符串,计数m。从前往后计数,当数到m个元素时,m个元素出列,同时将该元素赋值给m,然后从下一个数计数循环,直到所有数字都出列,给定的数全部为大于0的数字。输出出队队列
	 */
	public static void main(String[] args) {
		 int len=4;  
	        String str="3,1,2,4";     
	        int m=7;    
	        Test9 test9 = new Test9();  
	        System.out.println(test9.getOutString(len, str, m)); 
	}
	
	public String getOutString(int len, String str, int m) {  
		int i=0,cur=0;
		String []arr = str.split(",");
		ArrayList<String> vt = new ArrayList<String>();
		for(;i<len;i++) vt.add(arr[i]);
		
		while(vt.size()!=0){
		   int size = vt.size();
		   int temp = ( m+cur-1 )% size;
		   cur =  temp;
		   System.out.print("--"+vt.toString()+"--");
		   System.out.print(vt.get(temp)+",");
		   m = Integer.parseInt(vt.get(temp));
		   vt.remove(temp);
		}
		return "";
	}

}

8、 问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
 1、  长度13位;
2、  以86的国家码打头;
3、  手机号码的每一位都是数字。
 请实现手机号码合法性判断的函数(注:考生无需关注手机号码的真实性,也就是说诸如86123123456789这样的手机号码,我们也认为是合法的),要求:
1)  如果手机号码合法,返回0;
2)  如果手机号码长度不合法,返回1
3)  如果手机号码中包含非数字的字符,返回2;
4)  如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int s int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】  无
【返回】  判断的结果,类型为int。
示例
输入:  inMsisdn = “869123456789“
输出:  无
返回:  1
输入:  inMsisdn = “8813912345678“
输出:  无
返回:  3
输入:  inMsisdn = “8613912345678“
输出:  无

返回:  0

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test10 {

	/**
	 * @param 手机号码标准格式为
	 *            :国家码+手机号码,例如:8613912345678
	 */
	public static void main(String[] args) {
		String  inMsisdn = "8613912315678";  
        System.out.println(new Test10().verifyMsisdn(inMsisdn));  
	}

	int verifyMsisdn(String str) {
		Matcher mat = Pattern.compile("86\\d{11}$").matcher(str);
		if (mat.find())
			return 0;
		else {
			if (str.length() != 13) {
				return 1;
			} else {
				Matcher mat1 = Pattern.compile("86\\S{11}$").matcher(str);
				if (mat1.find())
					return 2;
				else{   //余下的情况就是:开头不是86
					return 3;
				}
			}
		}
	}

}

另附网上的方法,利用了Character的静态函数isDigit和digit(int,int)

int verifyMsisdn(String str) {
	char[] inchars = str.toCharArray();  
        if(inchars.length!=13) return 1;  
        for(int i=0;i<13;i++) {  
            if(!Character.isDigit(inchars[i])){  
                return 2;  
            }  
        }  
        if((Character.digit(inchars[0], 10)!=8 )||(Character.digit(inchars[1], 10)!=6) ) return 3;  
        else return 0;  
	}

8、

输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。

    例如:  输入:3+8×2/9-2  

             输出:2  

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;


public class Test11 {

	/**
	 * @param 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。
                                                 例如:  输入:3+8×2/9-2  
                                                 输出:2  
              public int getMyRet(String str)  
	 */
	public static void main(String[] args) {
       Test11 test11 = new Test11();
       System.out.println(test11.getMyRet("3+2-8*2/2-2")+"");
	}
	
	public int getMyRet(String str) {
	   List<String> vt = new ArrayList<String>();
	   for(int i=0;i<str.length();i++) vt.add(str.charAt(i)+"");
	   for(int m=0;m<vt.size();m++){   
		   if(vt.get(m).equals("*")||vt.get(m).equals("/")){
			    if(vt.get(m).equals("*"))  vt.add(m-1,(Integer.parseInt(vt.get(m-1))*Integer.parseInt(vt.get(m+1)))+"");
			    else vt.add(m-1,(Integer.parseInt(vt.get(m-1))/Integer.parseInt(vt.get(m+1)))+"");
			    vt.remove(m);
			    vt.remove(m);
			    vt.remove(m);
			    m --;
		   }
	   }
       //经过这个处理以后,就不包含乘除了  
	   for(int m=1;m<vt.size()&&m!=0;m++){
		   if(vt.get(m).equals("+")||vt.get(m).equals("-")){
			    if(vt.get(m).equals("+"))  vt.add(m-1,(Integer.parseInt(vt.get(m-1))+Integer.parseInt(vt.get(m+1)))+"");
			    else vt.add(m-1,(Integer.parseInt(vt.get(m-1))-Integer.parseInt(vt.get(m+1)))+"");
			    vt.remove(m);
			    vt.remove(m);
			    vt.remove(m);
			    m --;
		   }
	   }
		
		return Integer.parseInt(vt.get(0));
	}

}


9、评委打分问题。

选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家
评委,judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分  * 
0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。

public class Test13 {

	/**
	 * @param 评委打分
	 */
	public static void main(String[] args) {
		 int score[] = {  
	                34,53,65,75,64  
	        };  
	        int judge_type[] = {  
	                1,1,1,2,2  
	        };  
	        Test13 test13 = new Test13();  
	        System.out.println(test13.cal_score(score, judge_type, 5)); 
	        
	       // System.out.println((int)(0.4*3));
	}
	
	public int cal_score(int score[], int judge_type[], int n){  
	   int a =0,b=0,as=0,bs=0;  //a:专家、b:大众
	   for(int i=0;i<judge_type.length;i++){
		   if(judge_type[i]==1)  { a++; as+=score[i]; }
		   else if(judge_type[i]==2)  { b++; bs+=score[i]; }
		   return ( b==0 )?(as):((int)(0.4*(bs/b)+(int)0.6*(as/a)));   
	   }
	   return 0;	
	}

}

10、将一个字符串的元音字母复制到另一个字符串,并进行排序操作。输入: Abort!May Be Some Errors In Out System.输出:aeeeooAEIO

public class Test17 {

	/**
	 * @param 将一个字符串的元音字母复制到另一个字符串,并进行排序操作   元音字母是a,e,i,o,u,A,E,I,O,U
	 */
	static String dest="";
	public static void main(String[] args) {
        Test17 test17 = new Test17();
        String soure = "Abort!May Be Some Errors In Out System. ";
        test17.sortVowel(soure);
        System.out.println(dest);
	}
	
	public void sortVowel(String source){
           for(int i=0;i<source.length();i++){
               char ch = source.charAt(i);
               if(ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='A'||ch=='E'||ch=='I'||ch=='O'){
            	     dest +=ch;
               }
           }
           //对dest进行排序
           StringBuffer big = new StringBuffer("");   
           StringBuffer small = new StringBuffer("");
           for(int j=0;j<dest.length();j++){
               char ch2 = dest.charAt(j);
               if(ch2=='A'||ch2=='E'||ch2=='I'||ch2=='O'){
            	     big.append(ch2);
               }else small.append(ch2);
           }   
          //对big和small进行冒泡排序
           for(int m=0;m<big.length();m++)
        	   for(int n=m+1;n<big.length();n++){
        		   if(big.charAt(m)>big.charAt(n)){
        			    char temp = big.charAt(m);
        			    big.setCharAt(m,big.charAt(n));
        			    big.setCharAt(n,temp);
        		   }
        	 }
           for(int m=0;m<small.length();m++)
        	   for(int n=m+1;n<small.length();n++){
        		   if(small.charAt(m)>small.charAt(n)){
        			    char temp = small.charAt(m);
        			    small.setCharAt(m,small.charAt(n));
        			    small.setCharAt(n,temp);
        		   }
        	 }
           
          dest = small.toString()+big.toString();
               
       
	}
}

 


你可能感兴趣的:(华为java上机试题)