数组专题练习

删除排序数组中的重复项

	/***
	 * 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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值