1:有两个有序整数集合a和b,写一个函数找出它们的交集?
import java.util.ArrayList;
public class Test {
public static void main(String args[]) throws Exception {
int[] a = {2, 3, 4, 4, 4, 4, 7, 8, 8, 8, 8, 9, 100, 130, 150, 160};
int[] b = {4, 6, 7, 7, 7, 7, 8, 8, 9, 10, 100, 130, 130, 140, 150};
int i=0,j=0;
ArrayList al=new ArrayList();
while(i<a.length&&(j<b.length)){
if(a[i]<b[j])
i++;
else if(a[i]>b[j])
j++;
else{
i++;j++;
al.add(a[i]);
}
}
System.out.println(al);
}
} //由两个序列的第一个开始判断,因为有序,所以a<b时判断a的下一个,反之判断b的下一个。如果相等就是交集部分,进行添加。
2:给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字),使得这个“子数组”的和是所有“子数组”和中最大的,
如给定的数组为12, -8, 5, 66, -21, 0 ,35, -44,7,则最大的和的子数组为{12, -8, 5, 66, -21, 0 ,35},最大的和为89.
可以直接求解:
public class Test {
public static void main(String args[]) throws Exception {
int a[]= {12,-8,5,66,-21,0,35,-44,7};
int n=a.length;
int max =0;
int i, j, sum;
for(i = 0; i < n; i++)
{
sum = 0;
for(j = i; j < n; j++)
{
sum += a[j];
if(sum > max )
max = sum;
}
}
int result=0;
int m=0;
for (int k=0;k<n;k++) {
result=result+a[k];
if (result==max) {
m=k;
}
}
for (int p=0;p<=m;p++) {
System.out.print(a[p]+" ");
}
System.out.println("\n"+max);
}
} //直接相加找出最大序列和,然后标记下此时的下标求出最大和的序列
3:一个数组,“支配者”是在数组中出现频率超过一半的整数,
例如[3,4,3,2,-1,3,3,3]数值“3”出现过5次,5除以8大于0.5
所以数值“3”是一个支配者;
而在这个数组中的支配者出现在数组下标[0,2,4,6,7]
写一个函数,在给定的整数数组中找出支配者所在的任意一个数组下标,如果一个数组中没有支配者返回-1;
import java.util.LinkedList;
public class Test
{
public static void main(String[] args)
{
int []num={3,4,3,2,-1,3,3,3};
LinkedList ll=new LinkedList();
float temp;
int n=0;
for(int i=0;i<num.length-1;i++)
{
for(int j=i+1;j<num.length;j++)
{
if(num[i]==num[j])
{
ll.add(new Integer(num[j]));
//将数组中与a[i]相同的值添加到列表中,a[i]未包含,所以最终的个数要+1
}
}
temp=ll.size()+1; //求数组中相同值的个数,并转换为float型,方便下面的除法运算
ll.clear(); //清空列表,保证只有出现支配者的时候才输出的值没有之前的
if(temp/num.length>0.5) //判断是否为支配者
{
System.out.println("该数组中的支配者为:"+num[i]+",下标为:");
for(int m=i;m<num.length;m++) //找到该支配者的下标
{
if(num[i]==num[m])
System.out.println(m);
}
n++; //判断支配者的个数,如果最终为0,则没有支配者
}
}
if(n==0)
{
System.out.println("-1");
}
}
}