您的位置:首页 > 编程语言 > Java开发

经典笔试编程题--Java实现

2017-11-02 14:02 302 查看
题目:

1.输入一个正数n,输出所有和为n 连续正数序列。

例如输入15 = 1+2+3+4+5 = 4+5+6 = 7+8.

public static int sum(int num) {
int sum = 0;
for (int i = 0; i < num; i++) {
sum += i;
}
return sum;
}

public static List<int[]> getResult(int n) {
List<int[]> resultList = new ArrayList<>();
int x = 1;
while(x <= n/2 + 1) {
int num = 2;
int tempSum = num * x + sum(num);
while(tempSum <= n) {
if(tempSum == n) {
int[] arr = new int[num];
for (int i = 0; i < num; i++) {
arr[i] = x + i;
}
resultList.add(arr);
break;
}else if(tempSum < n) {
num++;
tempSum = num * x + sum(num);
}
}
x++;
}
return resultList;
}


//等差数列求和: n(a1+an)/2
public static int sum(int min, int max) {
return (max -min + 1) * (max + min) / 2;
}

public static void sumN(int n) {
for(int i = 1; i <= (n >> 1); i ++) {
for(int j = i + 1; j <= (n >> 1) + 1; j++) {
if(n == sum(i, j)) {
System.out.println(i + "~" + j);
break;
} else if(n < sum(i, j)) {
break;
}
4000
}
}
}


2.二分查找:

循环二分查找:

public static int binarySearch(int[] arr, int key) {
int low = 0;
int high = arr.length - 1;
while(low <= high) {
int mid = (low + high) >> 1;
int midVal = arr[mid];
if(key == midVal) {
return mid;
} else if(key > midVal) {
low = mid + 1;
} else if(key < midVal){
high = mid - 1;
}
}
return -(low + 1);
}


递归二分查找:

public static int binarySearch1(int[] arr, int key, int low, int high) {
if(low <= high) {
int mid = (low + high) >> 1;
int midVal = arr[mid];
if(key == midVal) {
return mid;
} else if(key > midVal) {
low = mid + 1;
} else if(key < midVal) {
high = mid - 1;
}
return binarySearch1(arr, key, low, high);
}

return -1;

}


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

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

package test;

import java.util.HashSet;
import java.util.Set;

/**
*
* @ClassName: StringRepeat
* @Description: TODO(对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符)
* @author chenliming
* @date 2017年11月2日 下午1:46:21
*
*/
public class StringRepeat {

//(1)通过循环获取,效率最低
public static int firstRepeat(String str) {
char[] array = str.toCharArray();
int firstIndex = -1;
for (int i = 0; i < array.length; i++) {
if(firstIndex != -1 && i > firstIndex) {
break;
}
for (int j = i + 1; j < array.length; j++) {
if(firstIndex != -1 && j > firstIndex) {
break;
}

if(array[j] == array[i]) {
if(firstIndex == -1) {
firstIndex = j;
} else if(j < firstIndex) {
firstIndex = j;
}
}
}
}

return firstIndex;
}

//(2)方法2:通过hashset集合的特性,当向集合添加数据返回false即获取到对应的值
public static int firstRepeat1(String str) {
char[] array = str.toCharArray();
Set<Character> set = new HashSet<>();
for (int i = 0; i < array.length; i++) {
boolean flag = set.add(array[i]);
if(!flag) {
return i;
}
}
return -1;
}

public static void main(String[] args) {
String str = "acfdefgre4344tfagga";
System.out.println(firstRepeat(str));

System.out.println(firstRepeat1(str));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: