1.leetCode495
在《英雄联盟》的世界中,
有一个叫 “提莫” 的英雄,
他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。
现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,
你需要输出艾希的中毒状态总时长。
你可以认为提莫在给定的时间点进行攻击,并立即使艾希处于中毒状态。
示例1:
输入: [1,4], 2
输出: 4
原因: 在第 1 秒开始时,
提莫开始对艾希进行攻击并使其立即中毒。
中毒状态会维持 2 秒钟,直到第 2 秒钟结束。
在第 4 秒开始时,提莫再次攻击艾希,
使得艾希获得另外 2 秒的中毒时间。
所以最终输出 4 秒。
示例2:
输入: [1,2], 2
输出: 3
原因: 在第 1 秒开始时,
提莫开始对艾希进行攻击并使其立即中毒。
中毒状态会维持 2 秒钟,直到第 2 秒钟结束。
但是在第 2 秒开始时,提莫再次攻击了已经处于中毒状态的艾希。
由于中毒状态不可叠加,
提莫在第 2 秒开始时的这次攻击会在第 3 秒钟结束。
所以最终输出 3。
[1,4,7] 2 2+2+2=6
[1,3,5] 3 2+2+3=7
如果时间差大于中毒时间 满毒时间
如果时间差小于等于中毒事件 时间差
最后一秒直接加满毒时间
class Demo495{
public static void main(String args[]){
int[] timeSerives={1,3,4};
int duration=2;
int total=Text(timeSerives,duration);
System.out.println(total);
}
public static int Text(int[] timeSerives,int duration){
int total=0;
for(int i=0;i<timeSerives.length-1;i++){ //后面有timeSerives[i+1]故不能超过timeSerives.length-1
int delt=(timeSerives[i+1]-timeSerives[i]);
if(delt>duration){ //时间差大于中毒持续时间
total+=duration;
}else{
total+=delt;
}
}
total+=duration;//最后一秒之后都要加时间差
return total;
}
}
***2.leetCode905***3种方法
给定一个非负整数数组 A,
返回一个由 A 的所有偶数元素组成的数组,
后面跟 A 的所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
import java.util.Arrays;
class Demo905_1{
public static void main(String args[]){
int[] arr={1,2,3,4,5,6};
arr=Test(arr);
System.out.println(Arrays.toString(arr));
}
public static int[] Test(int[] arr){
/* if(arr==null){ //选择排序 判空,可能是一个空数组
return null;
}
for(int i=0;i<arr.length;i++){
if(arr[i]%2==0){ //可以不写
continue;
}
for(int j=i+1;j<arr.length;j++){
if(arr[j]%2==0){ //如果后一个是偶数则和前一个换
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
break;
}
}
}
return arr;
*/
/* //夹逼排序
if(arr=null){
return null;
}
int start=0;
int end=arr.length-1;
while(start<end){
if(arr[start]%2==0&&arr[end]%2==0){ //头尾都为偶时 头后移
start++;
}
else if(arr[start]%2==0&&arr[end]%2==1){ //头偶尾奇时 头后移,尾前移
start++;
end--;
}
else if(arr[start]%2==1&&arr[end]%2==0){ //头奇尾偶时 交换
int temp;
temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
else{ //头尾都为奇时 尾前移
end--;
}
}
return arr;
*/
//插入排序
if(arr==null){
return null;
}
for(int i=0;i<arr.length;i++){
if(arr[i]%2==0){
int e=arr[i];
int j; //后面arr[j]要使用,所以定义在外面
for(int j=i;j>0&&arr[j-1]%2==1;j--){//前面有数子且为奇数
arr[j]=arr[j-1]; //相当于奇数后移,偶数赋值给之前的奇数的位置
}
arr[j]=e;
}
}
return arr;
}
}
***3、LeetCode169***两种解法
给定一个大小为 n 的数组,找到其中的众数。
众数是指在数组中出现次数大于 n/2 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
import java.util.Arrays;
class Demo169{
public static void main(String args[]){
int[] arr={1,2,2,4,2,2};
int majority;
majority=majorityElement(arr);
System.out.println(majority);
}
public static int majorityElement(int[] arr){
Arrays.sort(arr);//对一个数组的所有元素从小到大排序
int maxCount=0;
int majority=0;
for(int i=0;i<arr.length;){
int count=1;
for(int j=i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
count++;
}else{
break;
}
}
if(count>maxCount){
maxCount=count;
majority=arr[i];
}
i+=count;
if(i>arr.length/2){
break;
}
}
return majority;
}
}
import java.util.Arrays;
class Demo169_2{
public static void main(String args[]){
int[] nums={1,2,2,4,2,2};
int maj; //定义一个众数
maj=majorityElement(nums);
System.out.println(maj);
}
public static int majorityElement(int[] nums){
int maj=nums[0];//先随机取一个值令为maj
int count=1;//标记这个数字的次数
for(int i=0;i<nums.length;i++){
if(nums[i]==maj){ //相等则是同一个数
count++;
}else{
count--; //不相等时将当前count自减
if(count==0){
maj=nums[i];//count为0时则当前众数被后面来的num[i]所替代
count=1;//此时重新标记count从1开始
}
}
}
return maj;//返回这一个众数
}
}