1.系统设计
搜狐已经累计拥有千万级别会员用户,会员成长值公式为:会员成长值=每天成长值+任务成长值。输入一组数组,第一行是n,表示接下来有n行数据输入,从第二行开始,如果第一个是1,则该行有4个数据,第一个1表示每日成长规则,第二个数字表示开始时间,第三个数字表示截止时间,第四个数字表示每日成长值。如果第一个数字是2,则该行总共有3个数字,第二个数字表示某一天做任务,第三个数字表示任务成长值。两种形式,每日成长和任务分别有时间重叠,则以成长值最大值为准。
如:
3
1 1 5 10
2 3 4
1 4 6 -5
输出:49
上面例子第一个规则1-5天每天增加10,而第三个规则4-6天每天减5,这里4和5是重叠的,那么这两天以10为成长值。
解析:这题,因为刚开始不知道天数大小,不利于开数组,所以利用了hashmap,两个规则分别用两个规则,以天为key值,成长值或者任务值为value,每次记录并且同一种规则下同一天保留较大值。
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
HashMap<Integer, Integer> hMap=new HashMap<>();
HashMap<Integer, Integer> hMap1=new HashMap<>();
for(int i=0;i<n;i++)
{
int flag=scanner.nextInt();
if(flag==1)
{
int start=scanner.nextInt();
int end=scanner.nextInt();
int value=scanner.nextInt();
for(int j=start;j<=end;j++)
{
if(hMap.containsKey(j))
hMap.put(j, Math.max(value, hMap.get(j)));
else
hMap.put(j, value);
}
}
if(flag==2)
{
int day=scanner.nextInt();
int addvalue=scanner.nextInt();
if(hMap1.containsKey(day))
hMap1.put(day, Math.max(addvalue, hMap1.get(day)));
else
hMap1.put(day, addvalue);
}
}
Object[] perDay=hMap.values().toArray();
Object[] work=hMap1.values().toArray();
int ans=0;
for(int i=0;i<perDay.length;i++)
ans+=(int)perDay[i];
for(int i=0;i<work.length;i++)
ans+=(int)work[i];
System.out.println(ans);
}
}
2.查找k个最小值
n个整数,输出最小的k个,
第一行输入n,k第二行输入n个整数,输出从小到大k个最小整数,并用逗号隔开。
如:
8 4
4 5 1 6 2 7 3 8
输出:
1,2,3,4
直接排序,然后取前k个:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int k=scanner.nextInt();
int[] res=new int[n];
for(int i=0;i<n;i++)
{
res[i]=scanner.nextInt();
}
Arrays.sort(res);
StringBuffer sBuffer=new StringBuffer();
for(int i=0;i<k-1;i++)
sBuffer.append(res[i]+",");
sBuffer.append(res[k-1]);
System.out.println(sBuffer.toString());
}
}