题目一:求众数 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3] 输出: 3
示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
Go实现
func majorityElement(nums []int) int { lens := len(nums) //num := make([]int) res := nums[0] for i := 0; i < lens; i++ { max := 1 for j := i + 1; j < lens; j++ { if nums[i] == nums[j] { max++ } if max > lens / 2 { return nums[i] } } } return res }题目二:买卖股票的最佳时机 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
解题思路: 买股票想要获取最大利润,那么我们首先需要先检查数组中第一个数字,也就是说第一天的价格是7,第二天价格是1,很明显我们不会在最贵的时候买股票。 所以我们最开始在第二天买,也就是价格等于1的时候买,第三天价格变成了5,说明有钱赚了,那么就马上卖掉。这时候利润就是=5-1=4 然后我们在第四天价格等于3的时候买股票,第五天价格等于6,有钱赚,那么就马上卖掉即可。这时候利润就是=6-3=3 总利润就是4+3=7
由此我们可以得出结论,当明天的价格比今天的价格贵的时候我们今天买,明天卖,这样能够获取最大利润
/**/ class Solution { public int maxProfit(int[] prices) { int max = 0; for(int i = 0; i < prices.length - 1; i++) { if(prices[i] < prices[i + 1]) { max += prices[i + 1] - prices[i]; } } return max; } }题目三:报数
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1112112111112211 被读作 “one 1” (“一个一”) , 即 11。 11 被读作 “two 1s” (“两个一”), 即 21。 21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1 输出: “1”
示例 2:
输入: 4 输出: “1211”
class Solution { public String countAndSay(int n) { String s = "1"; int k; for (int i = 1; i < n; i++) { StringBuilder t = new StringBuilder(); for (int j = 0; j < s.length(); j = k) { k = j; while(k < s.length() && s.charAt(k) == s.charAt(j)) { k++; } t.append(k - j).append(s.charAt(j)); } s = t.toString(); } return s; } }