博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法编程题
阅读量:7071 次
发布时间:2019-06-28

本文共 4959 字,大约阅读时间需要 16 分钟。

hot3.png

1、

题目描述

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

给定一个字符串(不一定全为字母)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 hs=new HashSet<>();				for (int i = 0; i < n; i++) {			boolean b=hs.add(a[i]);			if (!b) {				return a[i];			}		}				return 0;	}	    }

2、

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

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

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

测试样例:

[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;    }}

3、

请设计一个复杂度为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;	        		}	}

4、

题目描述

世界上有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;    }

5、

题目描述

对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括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;    }

6、

题目描述

小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面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);    }}

7、

题目描述

现定义数组单调和为所有元素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;    }}

8、

有一个字符串例如“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;	 }

9、

给定一个字符串数组,例如{“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
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])); }

 

转载于:https://my.oschina.net/tomcater/blog/706441

你可能感兴趣的文章
Linux命令行技巧zz
查看>>
android 模拟器使用SDcard
查看>>
android去除标题栏和状态栏
查看>>
[转]利用 NPOI 變更字體尺寸及樣式
查看>>
eval解析JSON字符串的一个小问题
查看>>
jquery简单原则器(匹配除了指定选择器之外的元素 selector 表示选择器)
查看>>
update使用inner join
查看>>
Vue2.x中的父子组件相互通信
查看>>
多种替身邮方法总结!
查看>>
沟通比文档更有力
查看>>
Ural_1073. Square Country(DP)
查看>>
asp.net的10个提升性能或扩展性的秘密(二)
查看>>
[转载]我的WCF之旅(3):在WCF中实现双工通信
查看>>
Jquery中替换节点的方法replaceWith()和replaceAll()
查看>>
谈谈android模拟器和真机的差别
查看>>
upx最新壳脱壳测试
查看>>
[原创]手写一个PE文件
查看>>
安装php xdebug扩展
查看>>
junit junit4
查看>>
HUT-XXXX 数字游戏 求解区间的最值
查看>>