leetcode刷题(Excel相关、摩尔投票法、循环数组)

题目一描述:
Excel表列名称:输入一个整数的元素,返回结果是其对应的列名

第1列 A
第2列 B
第3列 C

第27列 AA
第28列 AB

题目一分析:
根据题目的分析是一个26进制,每26就向上进一位。类似于一个周期函数那种,一个数对26取余可以得出其是哪一个字符,元素除以26可以算出元素在第几个周期中。例如:26取余26是0,26/26是1,说明26是第一个周期中的最后一个元素,因此其字符是‘A’+25对应的字符。
本人采用递归的过程,每次计算当前余数所在的位置进行拼接,最后反转字符串。
代码如下:

class Solution {
   public  String convertToTitle(int n) {
        StringBuilder sb = new StringBuilder();
        return convertToTitle2(n,sb);
    }
    public String convertToTitle2(int n,StringBuilder sb ){
        if(n==0) return sb.reverse().toString();
        int tmp = (n-1)%26;
        sb.append(((char)('A'+tmp)));
        return convertToTitle2((n-1) / 26,sb);
    }
}

题目二描述:
Excel表列序号

A 1
B 2
C 3

AB 28
AC 29

题目二分析:
这种题目运算相当于将进制转换成十进制的数字,类比二进制:
0101转换成十进制为:0*23+1*22+0*21+1*20=5
类比十六进制:BC转换成十进制:11*161+12*160=188
代码如下:

class Solution {
    public int titleToNumber(String s) {
        int len  = s.length()-1;
        int res = 0;
        //遍历字符串的每一位,对其进行转换累加操作第n位乘以26的n次幂
        for(int i=0;i<=len;i++){
            int tmp = s.charAt(i)-'A'+1;
            res+=tmp*Math.pow(26,len-i);
        }
        return res;      
    }
}

题目三描述:
给定一个数组从数组中找出出现次数最多的元素,题目中使用到了摩尔投票法。(ps:大神的思想)
题目三分析:
大致思想:创建一个指针res指向第一个位置并给其投一票count=1
1.后一个元素与res相同count++;
2.如果count>0,后一个位置与res元素不同,count–;
3…当count=0时更换res指针,这就说明有一个元素将res元素的投票归零,说明当前元素的票数更多并将将count=1
代码如下:

class Solution {
    public int majorityElement(int[] nums) {
        int res = nums[0];
        int count = 1;
       for(int i=1;i<nums.length;i++){
           if(count>0&&nums[i]==res){
               count++;
           }else if(count>0&&nums[i]!=res){
               count--;
           }else{
               count = 1;
               res = nums[i];
           }
       }
       return res;
    }
}

题目四描述:
给定一个数组将数组元素向后移动K个位置
题目四分析:
数组长度大于k是,将后面k个元素复制到数组最先面,将数组前面的length-k个元素复制到最后,比较空间,是一个O(K)的空间复杂度
可以分为k比数组长度长:那么就相当于是一个重复移动的过程,先将k重新复制,k = k%num.length可以算出数组移动多长
代码如下:

class Solution {
    public void rotate(int[] nums, int k) {
        if(nums.length<=1)return;
         if(k>nums.length) k = k%nums.length;
        int[] arr = new int[k];
       System.arraycopy(nums,nums.length-k,arr,0,k);
        System.arraycopy(nums,0,nums,k,nums.length-k);
        System.arraycopy(arr,0,nums,0,k);
    }
}

说明:自己csdn博客现在专注于面试题目的记录,其余的学习笔记和学习的分享在个人搭建的博客上,希望能够一起讨论学习。
个人博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值