华为机试答案,自己写的

1.字符串过滤

示例 
输入:“deefd”        输出:“def”
输入:“afafafaf”     输出:“af”
输入:“pppppppp”     输出:“p”

	public static void fun(String s){
		int count[]=new int[26]; //记录每个字母是否出现过,没出现过就是0
		for(int i=0;i<s.length();i++)
		{
			if(count[s.charAt(i)-'a']==0){        //这个刚好算出来每个字母对应的位置
				System.out.print(s.charAt(i));
				count[s.charAt(i)-'a']++;
			}
		}
	}

2.压缩字符串

1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

	public static void fun(String s){
		int count=1; //出现一次的时候都是1
		ArrayList list=new ArrayList();
		char a[]=s.toCharArray();
		for(int i=0;i<a.length;i++)
		{
			int j=i+1;
			if(j<a.length&&a[j]==a[i]){
			    count++;//多出现一次就加1
			    j++;		//指针往后移动
			}
			if(count==1)
				list.add(a[i]);//一次的时候就直接添加字母
			else{
				list.add(count);// 不是一次的时候就添加次数再添加字母
				list.add(a[i]);
				count=1;
				i=j-1;  //把i指向最后不等于的那个因为i会自增所以指向前一个
			}
		}
		Iterator it=list.iterator();
		while(it.hasNext())
			System.out.print(it.next().toString());
	}

3.约瑟夫环问题

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺 比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 

	public static void fun(String s,int n){
		char c[]=s.toCharArray();
		ArrayList list=new ArrayList();
		for(int i=0;i<c.length;i++)
			list.add(c[i]);
		int count =n;
		for(int i=0;i<c.length;i++){
			int temp=(n-1)%list.size();
			System.out.print(list.get(temp));
			list.remove(temp);
			n=temp+count;
		}
	}

4.数组比较(20分) • 问题描述:  

比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数 

比如:数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0 数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3 • 要求实现函数:  

int array_compare(int len1, int array1[], int len2, int array2[]) • 示例  

1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5      函数返回:0 

2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6     函数返回:3 

我用java写:

	public static int array_compare(int []a,int []b,int len1,int len2){
		int len=len1<len2?len1:len2;  //先算出最短的
		int count=0;
		for(int i=0;i<len;i++){  //比较次数为最短数组的那个
			if(!(a[len1-i-1]==b[len2-i-1]))  //要倒着比就是数字最大的-1比len个就是len1-i-1
					count++;             //从len1-1倒数len个两个数组比较,不同计数器加1
		}
		return count;
	}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值