算法编程题

一、java

题目描述

对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。面试

给定一个字符串(不必定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。算法

测试样例:数组

"qywyer23tdd",11
返回:y

分析:hashset不容许又重复元素加入。微信

import java.util.*;

public class FirstRepeat {
    public char findFirstRepeat(String A, int n) {
        char[] a=A.toCharArray();
		HashSet<Object> hs=new HashSet<>();
		
		for (int i = 0; i < n; i++) {
			boolean b=hs.add(a[i]);
			if (!b) {
				return a[i];
			}
		}
		
		return 0;
	}
	
    
}

二、函数

春节期间小明使用微信收到不少个红包,很是开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽量高效。测试

给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。this

若没有金额超过总数的一半,返回0。spa

测试样例:设计

[1,2,3,2,2],5
返回:2

分析:先进行排序,当某个金额多于一半的时候,数组的中间值一定是多于一一半的值,注意考虑没有超过一半的状况,返回0。

import java.util.*;
 
public class Gift {
    public int getValue(int[] gifts, int n) {
        Arrays.sort(gifts);
            int ans = gifts[n/2];
            int num = 0;
            for(int i = 0; i < gifts.length; i++) {
                if(gifts[i] == ans) {
                    num++;
                }
            }
            return num <= n/2 ? 0 : ans;
    }
}

三、

请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。

给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。

测试样例:

[9,3,1,10],4
返回:6

分析:数组长度等于2则直接返回两者只和的绝对值,不然对数组内元素先进行排序,而后两两作差放进List,最后排序list,输出最后一个元素即为最大。

/**
     * 寻找最大差值
     * @param A
     * @param n
     * @return
     */
	public static int findMaxDivision(int[] A, int n) {
		int m=0;
		int a = 0;
		Arrays.sort(A);
		if (n==2) {
			return Math.abs(A[0]-A[1]);	
		}else {

			List temp=new ArrayList<>();
			for (int i = 0; i < n-1; i++) {
				m=Math.abs(A[i]-A[i+1]);
				temp.add(m);				
			}
			Collections.sort(temp);
			a=(int) temp.get(temp.size()-1);
			return a;	        
		}
	}

四、

题目描述

世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不一样么? 

输入例子:

1999 2299

输出例子:

7

分析:两数作异或运算,0^1=1;1^0=1;1^1=0 即相同为1,不一样为0,最后统计1的个数便可。

/**
     * 得到两个整形二进制表达位数不一样的数量
     * 
     * @param m 整数m
     * @param n 整数n
     * @return 整型
     */
    public int countBitDiff(int m, int n) {
      int s=m^n;
      int count=0;
        while(s>0){
            s=s&(s-1);
            count++;
        }
     return count;
    }

五、

题目描述

对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。

给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。

测试样例:

"ABCDEFGH",8,4
返回:"FGHABCDE"

分析:首先关键位置不能大于字符串长度,而后根据特定位置进行字符串截取便可。

public String rotateString(String A, int n, int p) {
        if (p>n) {
	    	return null;	
	    	}
	    	String str1=A.substring(0,p+1);
	    	String str2=A.substring(p+1, n);
	    	return str2+str1;
    }

六、

题目描述

小东和三个朋友一块儿在楼上抛小球,他们站在楼房的不一样层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推知道所有落到地面不跳,求4个小球一共通过了多少米?(数字都为整数)

给定四个整数A,B,C,D,请返回所求结果。

测试样例:

100,90,80,70
返回:1020

分析:首先不要对距离取整,也就是遇到小数的状况取整会损失必定距离。不论是几个小球,先拿一个来分析,假设第一次是N,第二次就是N/2,第三次是N/4,依次类推。能够看出距离是一个首项是N,公比是1/2的等比数列,根据等比数列求和公式Sn=a1(1-q^n)/(1-q)这里须要考虑极限的状况,也就是小球反跳次数n无穷大时,q^n趋于0,因此求和公式变为Sn=a1/(1-q),因此小球距离S=N+N/(1-1/2)=3N。

import java.util.*;

public class Balls {
    public int calcDistance(int A, int B, int C, int D) {
        return 3*(A+B+C+D);
    }
}

七、

题目描述

现定义数组单调和为全部元素i的f(i)值之和。这里的f(i)函数定义为元素i左边(不包括其自身)小于等于它的数字之和。请设计一个高效算法,计算数组的单调和。

给定一个数组A同时给定数组的大小n,请返回数组的单调和。保证数组大小小于等于500,同时保证单调和不会超过int范围。

测试样例:

[1,3,5,2,4,6],6
返回:27

分析:先来解释一下题目,根据给的样例,从数组的第一个元素开始1,左边没有元素。3左边有一个元素且小于3,因此结果为1,接下来是5,左边两个元素且都小于5,结果为4,接下来是2,左边有三个元素,但只有一个小于2,结果为1,以此类推,最终结果为1+4+1+6+15=27。

倒序取数组元素,而后判断左边元素是否小于它,小于的元素相加,最后再相加全部结果,时间复杂度为O(n^2)

import java.util.*;

public class MonoSum {
    public int calcMonoSum(int[] A, int n) {
        int sum=0;
	    	for (int j = 0; j < n; j++) {				
	    		for (int i = n-2; i >= 0; i--) {
	    			if (A[i]<=A[n-1]) {
	    				System.out.println(A[i]);
	    				sum=sum+A[i];
	    			}
	    		}
	    		n--;
			}
		return sum;
    }
}

八、

有一个字符串例如“sdabisjabmla”,请计算相邻“ab”的个数。

例如:输入“sdabisjabmla”,判断相邻“ab”的个数,输出1。

分析:判断字符串不为空,字符串长度等于2仍是小于2,仍是大于2.难度不大。主要是各类状况的考虑。

/**
	  * 寻找相邻字符串个数
	  * @param str
	  * @param same
	  * @return
	  */
	 public static int Samecount(String str,String same){
		 int count=0;
		 if (str==null) {
			return -1;
		 }else if (str.length()==2) {
			if (same.equals(str)) {
				return 1;
			}
		 }else if (str.length()>2) {
			for (int i = 0; i < str.length()-1; i++) {
				if (str.substring(i, i+2).equals(same)) {
					count++;
				}
			}
		 }else{
			return 0;
		 }
		 return count;
	 }

九、

给定一个字符串数组,例如{“this”,“is”,“a”,“dog”,“is”,“this”},请依次输出每一个元素出现的次数,本例输出

this:2

is:2

a:1

dog:1

分析:第一次作这个题目彻底想偏了,想着用hashset,后来面试官提示用hashmap,当时没想起来,后来又想了想,能够用hashmap的key存储每一个元素,value存储出现次数,每次存储元素以前须要根据key检查一下是否已经存在,存在的话就把value加1,最后按数组的元素顺序查找map里面的value并输出。

/**
	  * 寻找数组元素每一个元素的出现次数并按出现顺序输出
	  * @param str
	  * @return
	  */
	 public static HashMap sameCount(String[] str){
		 HashMap<String, Integer> hm=new HashMap<>();
		 int count=0;
		 for (int i = 0; i < str.length; i++) {
			if (hm.containsKey(str[i])) {
				int c=hm.get(str[i]);
				hm.put(str[i],c+1);
			}else {
				hm.put(str[i],1);
			}
		}
		return hm;
	 }
//调用的时候
String[] s={"this","a","is","a","a","this"};
		HashMap map=sameCount(s);
		for (int i = 0; i < map.size(); i++) {
			System.out.println(s[i]+":"+map.get(s[i]));
		}
相关文章
相关标签/搜索