面试+算法之数组:多数元素、两数之和、三数之和、股票交易最大利润、连续元素最大求和、未出现的最小正整数、排序数组求某元素的索引位置、不重复的元素 您所在的位置:网站首页 psp自动关机问题 面试+算法之数组:多数元素、两数之和、三数之和、股票交易最大利润、连续元素最大求和、未出现的最小正整数、排序数组求某元素的索引位置、不重复的元素

面试+算法之数组:多数元素、两数之和、三数之和、股票交易最大利润、连续元素最大求和、未出现的最小正整数、排序数组求某元素的索引位置、不重复的元素

#面试+算法之数组:多数元素、两数之和、三数之和、股票交易最大利润、连续元素最大求和、未出现的最小正整数、排序数组求某元素的索引位置、不重复的元素| 来源: 网络整理| 查看: 265

概述

算法是一个程序员的核心竞争力,也是面试最重要的考查环节。本文整理一些与数组相关的基础算法题。

注:题目均搜集自网络,仅做汇总整理备忘录用。

考题多数元素

给定一个大小为n的数组,找到其中的多数元素和出现次数。多数元素:在数组中出现次数大于 ⌊n/2⌋ 的元素。

假定:数组非空且总是存在多数元素。

要求:时间复杂度为O(n)、空间复杂度为O(1)

public static int getMajority(int[] nums) { int count = 0; int result = 0; for (int item : nums) { if (item == result) { count += 1; } else { if (count == 0) { result = item; count = 1; } else { count -= 1; } } } return result;}两数之和

从给定的数组nums里面找到满足条件的两个数,使其和为目标值target。返回满足条件的一组结果即可,返回索引值。

分析:结果存在多种情况,题目要求只返回一种:

public static int[] twoSum(int[] nums, int target) { int[] answer = new int[2]; int n = nums.length; for (int i = 0; i t) { break; } if (nums[j] == t) { answer[1] = j + 1; break; } } if (answer[1] != 0) { break; } } return answer;}

如果需要返回全部满足条件的组合呢?

组合总和

给定一个无重复元素的数组nums和目标数 target,找出nums中所有可以使数字和为target的组合。

注:nums中的数字可以无限制重复被选取,组合不能重复。

public static List combinationSum(int[] nums, int target) { List resultList = new ArrayList(); List result = new ArrayList(); Arrays.sort(nums); dfs(nums, resultList, result, 0, target); return resultList;}

private static void dfs(int[] nums, List resultList, List result, int start, int target) { if (target >= 0) { if (target == 0) { resultList.add(new ArrayList(result)); } else { for (int i = start; i 三数之和股票交易的最大利润

给定一个非负整数元素组成的数组,其中的元素值表示股票的每日价格,求能获得的股票交易最大利润。

注:股票交易必须先买入,后卖出;可以多次买入卖出;只有卖出后才能获取到利润。

示例: 输入:​​​[3, 5, 4, 3, 1, 4]​​ 输出:5

public static int maxProfit(int[] prices) { int temp = 0; // 终止条件为length-1,防止数组越界 for (int i = 0; i prices[i]) { temp = temp + prices[i + 1] - prices[i]; } } return temp;}连续元素的最大和

给定一个包含负数的整数数组,求连续元素的最大求和。

public static int maxSubArray(int[] nums) { int maxSum = nums[0]; int curSum = 0; for (int n : nums) { curSum += n; if (curSum > maxSum) { maxSum = curSum; } if (curSum 给你一个未排序的整数数组 nums ,找出其中未出现的最小正整数。public static int firstMissingPositive(int[] nums) { int ls = nums.length; int index = 0; while (index 给定一个升序排列的整数数组nums,目标值target。找出给定目标值在数组中的开始位置和结束位置;如果数组中不存在目标值 target,返回​​[-1, -1]​​。

注:元素可能不存在,也可能出现不止2次。

public static int[] searchRange(int[] nums, int target) { int[] result = new int[2]; result[0] = floor(nums, target); result[1] = ceil(nums, target); return result;}

private static int floor(int[] nums, int target) { int left = -1; int right = nums.length - 1; while (left = 0 && nums[right - 1] == target) { return right - 1; } else { return -1; }}

不重复的元素

给定一个包含若干重复元素的数组,找出第一个未重复的元素。

分析:存在重复2次或以上的情况;存在多个元素未重复的情况。

public static int singleNumber(int[] nums) { Arrays.sort(nums); int res = 0; int i = 0; for (int j = 1; j 给定一个有序数组,和目标值target,将target插入到数组中,返回其索引值。

分析:数组可能包括负数,可能存在重复值,目标值也可能与数组元素重复。

public static int searchInsert(int[] nums, int target) { int left = 0, right = nums.length - 1; if (target nums[right]) { return nums.length; } while (left nums[mid]) { left = mid + 1; } else { return mid; } } return left;}数组元素可组成的最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注:输出结果可能非常大,返回一个字符串。 示例: 输入:​​​[3, 30, 34, 5, 9]​​ 输出:9534330

public static String largest(int[] nums) { int n = nums.length; for (int i = 0; i 给定一个非负整数数组,最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。

目标:使用最少的跳跃次数到达数组的最后一个位置。

public static int jump(int[] nums) { int end = 0; int steps = 0; int maxPosition = 0; // 不能等于length-1 for (int i = 0; i 给定一个数组nums和目标值target,原地移除所有数值等于target的元素,返回移除后数组的新长度。

注:不能使用额外的数组空间,必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

public static int removeElement(int[] nums, int target) { int len = nums.length; for (int i = 0; i 给定一个数组,数组每个元素值表示其高度值,单位值为1,每两个元素间隔单位值为1。为简化问题,假设水的宽度为单位1。求能盛水的最大体积。

示例: 输入:​​​[1, 8, 6, 2, 5, 4, 8, 3, 7]​​ 输出:49

public static int maxArea(int[] height) { int ret = 0; int temp; int j = height.length - 1; for (int i = 0; i height[j]) { j--; } else { i++; } } return ret;}参考



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有