Leetcode每天五题II-04

  1. 寻找峰值

峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞。

示例 1:

输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5
解释: 你的函数可以返回索引 1,其峰值元素为 2;
或者返回索引 5, 其峰值元素为 6。

思路:

二分查找大的那一半一定会有峰值(即nums[mid]<nums[mid+1]时,mid+1~N一定存在峰值)首先已知nums[mid+1]>nums[mid],那么mid+2只有两种可能,

  • 一个是大于mid+1,大于mid+1的情况,继续向右推,如果一直到数组的末尾都是大于的,那么可以肯定最后一个元素是峰值,因为nums[nums.length]=负无穷
  • 一个是小于mid+1,小于mid+1的情况,那么mid+1就是峰值,
class Solution(object):
    def findPeakElement(self, nums):
        low,high=0,len(nums)-1
        while low<high:
            mid = low + (high - low)/2
            if nums[mid+1] > nums[mid]:
                low=mid+1
            else:
                high = mid
        return low
  1. Excel表列序号

给定一个Excel表格中的列名称,返回其相应的列序号。

例如,

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

示例 1:

输入: “A”
输出: 1

示例 2:

输入: “AB”
输出: 28

class Solution {
	public static int titleToNumber(String s) {
		char[] chas = s.toCharArray();
		int num = 0;
		for (char c : chas) {
			num = num * 26 + c-'A'+1;
		}
		return num;
	}
}
  1. 最大数

给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。

示例 1:

输入: [10,2]
输出: 210

示例 2:

输入: [3,30,34,5,9]
输出: 9534330

说明:

输出结果可能非常大,所以你需要返回一个字符串而不是整数。

class Solution {
	public static String largestNumber(int[] nums) {
		Integer inums[] = new Integer[nums.length];
		for (int i = 0; i < inums.length; i++) {
			inums[i] = nums[i];
		}
		Arrays.sort(inums, (a, b) -> (b + "" + a).compareTo(a + "" + b));

		return inums[0] == 0 ? 0 + "" : Arrays.toString(inums).replaceAll("[\\D]", "");
	}
}
  1. 旋转数组
class Solution(object):
    def rotate(self, nums, k):
        k%=len(nums)
        i=0
        for num in nums[-k:]+nums[:-k]:
            nums[i] = num
            i+=1

翻转三次即可

void rotate(int* nums, int numsSize, int k){
    if(k>=numsSize)
        k %= numsSize;
    reverse(nums,0,numsSize-k-1);
    reverse(nums,numsSize-k,numsSize-1);
    reverse(nums,0,numsSize-1);
}

每次将最后一个数移动到头部,重复k次

class Solution(object):
    def rotate(self, nums, k):
        l = len(nums)
        k%=l
        while k:
            k-=1
            tmp = nums[-1]
            i = l-1
            while i>0:
                nums[i] = nums[i-1]
                i-=1
            nums[0] = tmp
        return nums
class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        k %= n;
        for (int i = 0; i < k; i++) {
            int temp = nums[n - 1];
            //从0..n-2位置的数复制1..n-1
            System.arraycopy(nums,0,nums,1,n-1);
            nums[0] = temp;
        }
    }
}
  1. 位1的个数

编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

思路:
每次n & n-1得到消去n最后一位二进制为1的数

class Solution(object):
    def hammingWeight(self, n):
        cnt = 0
        while n:
            n = n & n-1
            cnt+=1
        return cnt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值