华为2016校招 机试题

1. 删除字符串

import java.io.BufferedInputStream;
import java.util.Scanner;
/*
 * @author sunzhanpeng
 * @date 2015年9月14日21:45:50
 */
//删除字符串中重复的字符,并按ACSII码从小到大排序
public class HW1 {
	private static Scanner in = new Scanner(new BufferedInputStream(System.in));
	
	public String compressort(String s){
		StringBuffer sb = new StringBuffer();
		boolean[] letters = new boolean[256];
		char[] sa = s.toCharArray();
		for(char c:sa){
			letters[c] = true;
		}
		for(int i=0;i<letters.length;i++){
			if(letters[i]==true){
				sb.append((char)(i));
			}
		}
		return sb.toString();
	}
	public static void main(String[] args) {
//		String s = "5551DDD233AABC4";
		HW1 h = new HW1();
		while(in.hasNext()){
			String s = in.nextLine();
			System.out.println(h.compressort(s));
		}
		
	}
}

2.
<pre name="code" class="java">import java.io.BufferedInputStream;
import java.util.Scanner;

import edu.princeton.cs.algs4.SleepSort;

/*
 * @author sunzhanpeng
 * @date 2015年9月14日21:46:12
 * 
 * //身份证号 18位,
 * 最后一位为数字或小写英文字母,
 *前17都为数字,
 *7-14位为年月日信息
 *
 *年份大于1900,小于2100. 闰年:能被4整除且不能被100整除的年份,或者能被400整除的年份,闰年2月为29天,非闰年为28天
 *
 *输入多行字符串,每行一个身份证号,0表示结束,不用处理
 *
 *每个身份证号的合法性判断,输出一个整数:
 *1)如果身份证号合法,输出0
 *2)如果身份证号长度不合法,输出1
 *3)如果身份证号1-17位含有非数字的字符,输出2
 *4)如果身份证号第18位既不是数字也不是x,则输出3
 *5)如果身份证号年份非法,输出4
 *6)如果身份证号月份非法,输出5
 *7)如果身份证号日信息非法,输出6(注意闰年的情况)
 *8) 出成功情况外的  1-6优先级依次递减
 */

public class HW2 {
	
	private static Scanner in = new Scanner(new BufferedInputStream(System.in));
	
	public int isValidNum(String s){
		//如果身份证号长度不合法,输出1
		if(s.length() != 18){
			return 1;
		}
		
		//如果身份证号1-17位含有非数字的字符,输出2
		for(int i=0; i<17; i++){
			if(s.charAt(i)>'9' || s.charAt(i)<'0'){
				return 2;
			}
		}
		
		//如果身份证号第18位既不是数字也不是x,则输出3
		if(s.charAt(17) != 'x' && (s.charAt(17)>'9' || s.charAt(17)<'0')){
			return 3;
		}
		
		//如果身份证号年份非法,输出4
		int year = Integer.parseInt(s.substring(6, 10));
		if( year< 1900 || year>2100){
			return 4;
		}
		
		//如果身份证号月份非法,输出5
		int month = Integer.parseInt(s.substring(10, 12));
		if( month > 12 ||month < 1){
			return 5;
		}
		
		//如果身份证号日信息非法,输出6(注意闰年的情况)
		int day = Integer.parseInt(s.substring(12, 14));
		if( day> 31 || day < 1){
			return 6;
		}
		//处理30天的情况
		if(month ==4 || month==6|| month == 9|| month== 11){
			if(day>30 || day <1){
				return 6;
			}
		}
		if(year %100 == 0 ){
			if(year%400 == 0){
				//run
				if(month==2){
					if(day>29 || day<1){
						return 6;
					}
				}
			}
		}else {
			if(year%4 ==0){
				//run
				if(month==2){
					if(day>29 || day<1){
						return 6;
					}
				}
			}else {
				//fei run
				if(month == 2){
					if(day >28 || day <1){
						return 6;
					}
				}
			}
		}
		
		
		
		return 0;
		
	}
	
	public static void main(String[] args) {
		HW2 h = new HW2();
		while(in.hasNextLine()){
			String s = in.nextLine();
			
				System.out.println(h.isValidNum(s));
			
		}
	}
}


 3. 

 
 

import java.io.BufferedInputStream;
import java.util.Scanner;



public class HW3 {
	private String str = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
	private static Scanner in = new Scanner(new BufferedInputStream(System.in));
	
	public String procdkey(String s){
		//32个字符表
		char[] base = str.toCharArray();
		//从字符串中读出3个正整数
		String[] nums = s.split(" ");
		
		//前14位
		StringBuffer sb14 = new StringBuffer();
		
		int[] num = new int[nums.length];
		for (int i = 0; i < num.length; i++) {
			num[i] = Integer.valueOf(nums[i]);
		}
		
		//正整数转为bit,并逆序
		String s1 = buqicut(num[0]);
		String s2 = buqicut(num[1]);
		String s3 = buqicut(num[2]);
		//组合成48bit
		String base1 = s3+s2+s1;
		//再贴一个,14*5=70,再加一个足够用
		base1 = base1 + base1;
		
		//循环转换下表用的
		String[] xiabiao = new String[14];
		for(int m=0;m<xiabiao.length; m++){
			xiabiao[m] = "";
		}
		for(int i=0; i<14; i++){
			for(int j=i*5; j<(i+1)*5; j++){
				xiabiao[i] += base1.charAt(j);
			}
		}
		
		int [] xiab = new int[14];
		for (int i = 0; i < xiab.length; i++) {
			xiab[i] = Integer.parseInt(xiabiao[i], 2);
		}
		
		for(int i=0;i<14;i++){
			if((i+1)%4 == 0){
				sb14.append(base[xiab[i]]);
				sb14.append('-');
			}else {
				sb14.append(base[xiab[i]]);
			}
		}
		
		//取最后两位YY
		int asche = 0;
		for(int i=0;i<14;i++){
			asche += (int)(base[xiab[i]]);
		}
		
		String s4 = buqiyycut(asche);
		String[] s15 = new String[2];
		for(int m=0;m<s15.length; m++){
			s15[m] = "";
		}
		for(int i=0; i<2;i++){
			for(int j=i*5; j<(i+1)*5; j++){
				s15[i] += s4.charAt(j);
			}
		}
		
		int [] xiab2 = new int[2];
		for (int i = 0; i < xiab2.length; i++) {
			xiab2[i] = Integer.parseInt(s15[i], 2);
		}
		for(int i=0;i<2;i++){
			sb14.append(base[xiab2[i]]);
		}
		
		return sb14.toString();
	}
	
	//取低16bit,并翻转
	public String buqicut(int n){
		String bc = Integer.toBinaryString(n);
		
		if(bc.length() >= 16){
			bc = bc.substring(bc.length() -16);
		}else {
			int toadd = 16-bc.length();
			StringBuffer fore = new StringBuffer();
			for(int i=0; i<toadd; i++){
				fore.append('0');
			}
			bc = fore+bc;
			
		}
		return new StringBuilder(bc).reverse().toString();
	}
	
	//取低10bit,并翻转
	public String buqiyycut(int n){
		String bc = Integer.toBinaryString(n);
		
		if(bc.length() >= 10){
			bc = bc.substring(bc.length() -10);
		}else {
			int toadd = 10-bc.length();
			StringBuffer fore = new StringBuffer();
			for(int i=0; i<toadd; i++){
				fore.append('0');
			}
			bc = fore+bc;
			
		}
		return new StringBuilder(bc).reverse().toString();
	}
	
	public static void main(String[] args) {
//		System.out.println(Integer.toBinaryString(65520));
//		String s = "127";
//		while(in.hasNextLine()){
//			s = in.nextLine();
//			String[] nums = s.split(" ");
//			int[] num = new int[nums.length];
//			for (int i = 0; i < num.length; i++) {
//				num[i] = Integer.valueOf(nums[i]);
//				System.out.println(num[i]);
//			}
//		}
//		s = s.substring(s.length() - 5);
//		System.out.println(s);
		
//		HW3 h = new HW3();
//		System.out.println(h.buqicut(127));
		
//		System.out.println(Integer.parseInt("11111111", 2));
		
		HW3 h = new HW3();
		while(in.hasNextLine()){
			String s = in.nextLine();
			System.out.println(h.procdkey(s));
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值