题目1:
/**微软的一道题
* //有一个数组,让数组的每个元素除以数组的第一个元素,得到的商放在以前的位置上
*/
public class Test01 {
public static void main(String[] args) {
int[] arr = new int[]{12,64,85,-8,3,11};
for(int i=arr.length-1;i>=0;i--){
arr[i] = arr[i] / arr[0];
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
题目2:
import java.util.Scanner;
/**
* 输入两个正整数m和n,求其最大公约数和最小公倍数
*/
public class Test02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入第一个整数:");
int m = scanner.nextInt();
System.out.print("请输入第二个整数:");
int n = scanner.nextInt();
// max_min1(m,n);
max_min2(m,n);
}
private static void max_min2(int m, int n) {
int i =m ;
int j= n; //mn的值 这里要先保存下来,因为后面会变
int temp1;
if(m<n){ //两数对调,要先把一个值给到temp中
temp1 = n;
n = m;
m = temp1;
}
//得到mn中较小的数,然后求最大公约数
int temp2;
while(n != 0) { //小的那个数不为0,18%12=6, 大=小的 小=余数。再求余
temp2 = m%n;
m = n;
n = temp2;
}
System.out.println("最大公约数是:"+m);
System.out.println("最小公倍数是:"+i*j/m);
}
private static void max_min1(int m, int n) {
int min = (m < n)? m : n;
int max = (m > n)? m : n;
//最大公约数,最次最次是1
for(int i = min; i>=1; i--){
if(m%i == 0 && n%i == 0){
System.out.println("最大公约数是 "+i);
break; //一旦找到了,就是最大的,就退出循环
}
}
//最小公倍数,最次最次是二者乘积
for(int i = max;i<=m*n;i++){
if(i%m == 0 && i%n == 0){
System.out.println("最大公约数是 "+i);
break;
}
}
}
}
题目3:输入一个整形数组,数组里有整数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如:输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2,因此输出为该子数组的和18.
分析:如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的数组有O(n^2)个子数组;而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n^3)。