算法分析(含答案)笔试题 (7)

maxProfit(prices, i+1, prices.length-1);
sumProfit = Math.max(sumProfit, tmpsum);
}
return sumProfit;
}
public static int maxProfit(int[] prices,int s,int e){
if(e<=s) return 0;
int min = prices[s];
int maxProfit = 0;
for(int i=s+1;i<=e;i++){
maxProfit = Math.max(maxProfit, prices[i]-min);
min = Math.min(min, prices[i]);
}
return maxProfit;
}
public static void main(String[] args) {
int arr [] = {4,4,6,1,1,4,2,5};
System.out.println(maxProfit(arr));
} }

[编程]任给 n 个整数和一个整数 x。请计算 n 个整数中有多少对整数之
和等于 x。 public class Test8 {
public static void main(String[] args) {
//输入 n 个整数和一个整数
Scanner input = new Scanner(System.in);
System.out.println("请输入 n 个整数,数量任意,以逗号分隔
");
String str = input.next();
System.out.println("请输入一个整数:");
int x = input.nextInt();
//将 n 个整数的字符串转换为数组
String arr1[] = str.split(",");
int [] arr2 = new int[arr1.length];
for(int i=0;i<arr1.length;i++){
arr2[i] = Integer.parseInt(arr1[i]);
}
System.out.println(Arrays.toString(arr2));
//判断并输出 n 个整数中有几对的和等于 x
int count = 0;
for(int i=0;i<arr2.length-1;i++){
for(int j = i+1;j<arr2.length;j++){
if(arr2[i]+arr2[j]==x){
count++;
} } }
System.out.println(count);
} }

[编程]请说明快速排序算法的设计思想和时间复杂度,并用高级语言写出
对整数数组进行一趟快排的函数实现。
快速排序由 C. A. R. Hoare 在 1962 年提出。它的基本思想是:通过一趟排序将要排序
的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此
达到整个数据变成有序序列。
设要排序的数组是 A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)
作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,
这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就
是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1、设置两个变量 i、j,排序开始的时候:i=0,j=N-1; 2、以第一个数组元素作为关键数据,赋值给 key,即 key=A[0]; 3、从 j 开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key 的值 A[j],将 A[j]和 A[i]互
换;
4、从 i 开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 key 的 A[i],将 A[i]和 A[j]互换;
5、重复第 3、4 步,直到 i=j; (3,4 步中,没找到符合条件的值,即 3 中 A[j]不小于 key,4 中 A[i]
不大于 key 的时候改变 j、i 的值,使得 j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交
换的时候 i,j 指针位置不变。另外,i==j 这一过程一定正好是 i+或 j-完成的时候,此时令循环结束)。
public class Quick {
public static void main(String[] args) {
int arr [] = {90,60,70,50,40,80,20,100,10};
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int arr[], int low, int high) {
//设置两个变量 l、h,排序开始的时候:l=0,h=N-1
int l = low;
int h = high;
//以第一个数组元素作为关键数据,赋值给 key,即 key=A[0]
int key = arr[low];
//重复操作,直到 i=j
while (l < h) {
//从 h 开始向前搜索,即由后开始向前搜索(h--),找到第一个
小于 key 的值 arr[h],将 arr[h]和 arr[l]互换
while (l < h && arr[h] >= key) h--;
if (l < h) {
int temp = arr[h];
arr[h] = arr[l];
arr[l] = temp; l++;
}
//从 l 开始向后搜索,即由前开始向后搜索(l++),找到第一个
大于 key 的 arr[l],将 arr[l]和 arr[h]互换;
while (l < h && arr[l] <= key) l++;
if (l < h) {
int temp = arr[h];
arr[h] = arr[l];
arr[l] = temp; h--; } }
//对前一部分进行快速排序
if (l > low)
sort(arr, low, l - 1);
//对前一部分进行快速排序
if (h < high)
sort(arr, l + 1, high);
} }

对于一段形如:1,-13,115×3 的输入
输入会依照以下规则:
1、所有输入为整数、
2、“,”为分隔符
3、“”表示一个区间,比如“-13”表示-1 到 3 总共 5 个整数,同时“~”前的数小
于“~”后的数:
4、“x”表示步长,“x3”指每 3 个整数一个,比如“1~15×3”表示 1,4,7,10,13;
根据以上得到的结果进行打印,打印的规则为:
1、所有得到的整数按从小到大排列,以“,”分隔,不计重复;
2、每行最多显示 3 个整数;
3、如果两个整数是连续的,可以放在同一行,否则自动换行。
例如对于输入“1,-13,115×3”的输出结果为:
-1,0,1,
2,3,4,
7,
10,
13
public class Test {
public static void main(String[] args) {
Map<Integer, Integer> map = new TreeMap<Integer,
Integer>();
String str = "520x3,1,-13,1~15x3";
String[] s = str.split(",");
for (int i = 0; i < s.length; i++) {
if (s[i].contains("~")) {
String ss[] = s[i].split("~");
int first = Integer.parseInt(ss[0]);
if (s[i].contains("x")) {
String sss[] = ss[1].split("x");
int end = Integer.parseInt(sss[0]);
int l = Integer.parseInt(sss[1]);
for (int j = first; j < end;) {
map.put(j, j);
j += l; }
} else {
int end = Integer.parseInt(ss[ss.length

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfxsw.html