删除排序数组中的重复项
/***
* 1、给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
* 逻辑:
* 由于是有序数组,因此使用可以直接使用指针
* 定义一个指针,指向的是真实的数组长度
* 遍历数组时,当遇到相同的元素,则进行跳过,当遇到不同的元素时,将指针往后移动一位,并将新的元素填入
* 最后需要将指针+1--数组长度的数组下标的区别
*/
public static int removeDuplicates(int[] nums) {
int left = 0;
int len = nums.length;
for (int i = 1; i < len; i++) {
if(nums[i] == nums[left]) {
continue;
}
left ++;
nums[left]=nums[i];
}
left++;
return left;
}
买卖股票的最佳时机
/****
* 2.给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
* 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
* 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
*
* 逻辑:
* 实际上的逻辑就是求每一个递增区间最大值与最小值的差 当股票后一天比前一天涨的时候买入否则卖出,
* 即可赚顺差
*/
public static int maxProfit(int[] prices) {
int total = 0;
int len = prices.length;
for (int i = 1; i < len; i++) {
if(prices[i] > prices[i-1]) {
total += prices[i]-prices[i-1];
}
}
return total;
}
旋转数组
/***
* 3、给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
*
* 逻辑:
* 使用多次翻转,第一次把整个数组进行翻转, 0,1,2,3....n n,...3,2,1,0
* 那么现在进行向右移动k位,那么截取 n...(下标为k-1->m+1) m...0
* 然后将这两个数组分别进行翻转,--->把数组的顺序修正为 ....n-1,n,0,1,2,3
*/
public static void rotate(int[] nums, int k) {
int len = nums.length;
if( k < 1 || k%len == 0) {
return;
}
k = k%len;
reverse(nums,0,len-1);
reverse(nums,0,k-1);
reverse(nums,k,len-1);
}
/***
* 数组翻转操作
*/
public static void reverse(int[] nums,int start,int end) {
int tem;
while(start < end) {
tem = nums[end];
nums[end--] = nums[start];
nums[start++] = tem;
}
}
存在重复元素
/***
*
* 4、给定一个整数数组,判断是否存在重复元素。
* 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
* 逻辑:
* 可先对数组进行排序,然后遍历一次即可,比较前后两者是否相同
* 也可使用map、或者set的结构进行处理
* 遍历一次数组,并将数存入map映射中,如果已经存在该数,则说明是重复的
* set则直接将数set进去即可
*/
public static boolean containsDuplicate(int[] nums) {
Arrays.sort(nums);
int len = nums.length;
for (int i = 1; i < len; i++) {
if(nums[i] == nums[i-1]) {
return true;
}
}
return false;
}
只出现一次的数字
/***
* 5、给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
* 逻辑:
* 使用异或,异或:位运算--相同为0,不同为1;
* 1^1=0;0^0=0;1^0=1==>a^0=a
* 同时异或满足交换律==>a^b^a=a^a^b=0^b=b
*/
public static int singleNumber(int[] nums) {
int ret =nums[0];
int len = nums.length;
for (int i = 1; i < len; i++) {
ret = ret^nums[i];
}
return ret;
}