网上20132014华为机试的相关java实现(3)

1. 输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50。

/**
 *CountMinAddMax.java 
 */
package interview.huawei;

/**输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;
 * 另外数组的长度不超过50
 * @author xuhongbin
 * @data2014年9月20日下午7:10:16
 */
public class CountMinAddMax {
	
	public static int add(int[] num){
		int min = num[0];
		int max = num[0];
		for(int temp : num){
			if(temp > max){
				max = temp;
			}
			if(temp < min){
				min = temp;
			}
		}
		return min+max;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] t = new int[50];
		for(int i = 0; i < t.length; i++){
			t[i] = (int) (Math.random()*10);
			System.out.print(" " + t[i]);
		}
		System.out.println( );
		System.out.println(add(t));
	}

}



2.求两个长长整型的数据的和并输出,例如输入1233333333333333 。。。 3111111111111111111111111.。。。,则输出。。。。

具体代码:

/**
 *AddBigNum.java 
 */
package interview.huawei;

/**
 * @author xuhongbin
 * @data2014年9月20日下午7:24:27
 */
public class AddBigNum {
	public static void addBigNum(char[] a, char[] b, char[] conse){//存放结果的数组比加数多一位用于存储可能发生的进位。
		int jinwei = 0;
		int temp;
		int al = a.length-1;
		int bl = b.length-1;
		int index = conse.length-1;
		for(;al>=0&&bl>=0;al--,bl--,index--){
			temp = a[al]+b[bl]+jinwei;
			jinwei =(temp>=10? 1:0);
			conse[index] = (char) (temp%10);
		}
		while(al >= 0){
			temp = a[al]+jinwei;
			conse[index--] = (char) (temp%10);
			jinwei =(temp>10? 1:0);
			al--;
			
		}
		while(bl >= 0){
//			System.out.println(jinwei);
			temp = b[bl]+jinwei;
			conse[index--] = (char) (temp%10);
			jinwei =(temp>=10? 1:0);
			bl--;
		}
			conse[index] = (char) jinwei;
	}


	public static void main(String[] args) {
		char[] a =     {9,2,3};
		char[] b = {2,9,4,5,6};
		for(char c: a){
			System.out.print((int)c);
		}

		System.out.println();
		for(int i = 0; i<b.length;i++){
			
			System.out.print((int)b[i]);
		}
		System.out.println();
		
		char[] conse = new char[a.length>b.length? (a.length+1):(b.length+1)];
		addBigNum(a, b, conse);
		for(char c: conse){
			System.out.print((int)c);
		}
	}

}

3. 一组人(n个),围成一圈,从某人开始数到第三个的人出列,再接着从下一个人开始数,最终输出最终出列的人 (约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。)

具体代码实现:

/**
 *Josephus.java 
 */
package interview.huawei;

import java.util.BitSet;

/**
 * @author xuhongbin
 * @data2014年9月20日下午9:46:48
 */
public class Josephus {
	public static int printLastNode(int k, int m, int n){//k指从编号为k的人出发,m为从每次第m 个人出列,n为人数
		BitSet bs = new BitSet(n);//BitSet存储的是该数字是否被访问过,访问过为true,未访问过为false;
		int flag = 0;
		int index = 0;
		int count = 0;//表示将该表循环一次,没有任意一个数为false;
		for(int i= k-1; i< n;i++){
//			System.out.println(i-1);
			if(!bs.get(i)){
				count++;
				flag++;
				if(flag == m){
					System.out.println("第"+(i+1)+"个人自杀!!!");
					bs.set(i);
					index = i;
					flag= 0;
				}
			}
			if(i == n-1&& count > 0){
				i = -1;//特别注意该处i应初始化为-1,而非0,因为for循环还要对i进行+1操作。
				count = 0;
			}
		}
		return index+1;

	}
	public static void main(String[] args) {
		System.out.println(printLastNode(1, 3, 41)); //最后两个人应该是16和31。ok
	}

}


3. 字串转换
  问题描述:
  将输入的字符串(字符串仅包含小写字母’a'到’z'),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
  要求实现函数:
  void convert(char *input,char* output)
  【输入】 char *input , 输入的字符串
  【输出】 char *output ,输出的字符串
  【返回】无

具体代码如下:

/**
 *Stringtranslation.java 
 */
package interview.huawei;

/**
 *  问题描述: 
 * 将输入的字符串(字符串仅包含小写字母’a'到’z'),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。
 * 例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
 *  要求实现函数:
 * void convert(char *input,char* output)
 * @author xuhongbin
 * @data2014年9月21日上午9:55:11
 * 【输入】 char *input , 输入的字符串
 * 【输出】 char *output ,输出的字符串
 * 【返回】无
 */
public class Stringtranslation {
	public static void convert(char[] input,char[] output){
		char c = input[0];
		boolean flag = false;
		output[0] = (char) (c=='z'? 'a':(c+1));
		for(int i = 1; i < input.length; i++){
			if(input[i] != input[i-1]||(input[i]==input[i-1]&&flag)){
				flag = false;
				output[i] = (char) (input[i]=='z'? 'a':input[i]+1);
			}else{
				output[i]= (char) (output[i-1]=='z'? 'a':(output[i-1]+1));
				flag = true;
			}
		}
	}
	
	public static void main(String[] args) {
		String input =  "abcfgecdboikkndddav";
		String right = "bcdghfdecpjlmoefebw";
		System.out.println(right);
		char[] output = new char[input.length()];
		convert(input.toCharArray(),output);
		for(char c : output){
			System.out.print(c);
		}
	}

}

非常要注意flag的设定。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值