题目一描述:
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博客现在专注于面试题目的记录,其余的学习笔记和学习的分享在个人搭建的博客上,希望能够一起讨论学习。
个人博客