🏚1.整数反转
解题思路
代码
class Solution {
public int reverse(int x) {
int result=0;
while(x!=0){
int y=x%10;//得到个位数字
int newResult=result*10+y;
if((newResult-y)/10!=result){return 0;}
result=newResult;
x=x/10;
}
return result;
}
}
🏚2.字符串中的第一个唯一字符
解题思路 把字符串的字符放入hashmap中,key为字符,value为次数,在遍历一次取得value为1的字符。
代码
class Solution {
public int firstUniqChar(String s) {
HashMap<Character,Integer> map=new HashMap<Character,Integer>();
int n= s.length();
for(int i=0;i<n;i++){
char m=s.charAt(i);
map.put(m,map.getOrDefault(m,0)+1);
}
for(int i=0;i<n;i++){
char m=s.charAt(i);
if(map.get(m)==1){return i;}
}
return -1;
}
}
🏚3.有效的字母异位词
解题思路 定义一个大小为26的数组,代表字母a到z,将字符串s内的字符次数存入数组,同时减去字符串t的字符出现次数。最后判断数组是否所有元素为0。
代码
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length()!=t.length()){return false;}
int[] counter = new int[26];
for(int i=0;i<s.length();i++){
counter[s.charAt(i)-'a']++;
counter[t.charAt(i)-'a']--;
}
for(int count:counter){
if(count!=0){return false;}
}
return true;
}}
🏚4.字符串转换整数 (atoi)
代码
class Solution {
public int myAtoi(String str) {
int i=0;
int length=str.length();
while(i<length&&str.charAt(i)==' '){
//找到第一个非空字符
i++;
}
//如果字符串全空
if(i==length){return 0;}
//确定符号
int flag=1;
if(str.charAt(i)=='+'||str.charAt(i)=='-'){
if(str.charAt(i)=='-'){flag=-1;}
i++;
}
//定义结果
int ans=0;
while(i<length&&Character.isDigit(str.charAt(i))){//如果第一个字符是数字,再进行运算。
int temp=str.charAt(i)-'0';//将当前字符转换为数字
if(flag==1&&(ans>Integer.MAX_VALUE/10||(ans==Integer.MAX_VALUE/10&&temp>7))){//正数溢出
return Integer.MAX_VALUE;}
if(flag==-1&&(-ans<Integer.MIN_VALUE/10||(-ans==Integer.MIN_VALUE/10&&temp>8))){//负数溢出
return Integer.MIN_VALUE;}
ans=ans*10+temp;
i++;
}
return ans*flag;
}
}
🏚5.实现 strStr()
解题思路定义一个和needle字符串一样大小的滑动窗口,从haystack字符串开头开始匹配,成功匹配则返回当前首字母下标,若遍历完haystack字符串都不匹配则返回-1。
代码
class Solution {
public int strStr(String haystack, String needle) {
if(needle==null){return 0;}
int l=needle.length();
int n=haystack.length();
for(int start=0;start<n-l+1;start++){
if(haystack.substring(start,start+l).equals(needle)){return start;}
}
return -1;
}
}
🏚6.外观数列
解题思路观察得知,当前项和上一项有紧密的联系,所以递归得到上一项的字符串,遍历得到不同字符出现的次数,并将次数存起来,每查询完一个数字出现的次数,将次数和当前数字字符拼接进结果字符串
代码
class Solution {
public String countAndSay(int n) {
if(n==1){return "1";}
StringBuilder builder=new StringBuilder();
//得到上一 项
String str=countAndSay(n-1);
//从头开始遍历
int i=0;
while(i<str.length()){
//得到当前字符
char now=str.charAt(i);
int count=1;
//遍历得到当前字符的次数并存储到count中
for(int j=i+1;j<str.length();j++){
if(str.charAt(i)!=str.charAt(j)){break;}
if(str.charAt(i)==str.charAt(j)){count++;}
}
//将次数与字符存到字符串内
builder.append(count).append(now);
//将遍历的数字往下移到下一个不一样的字符
i=i+count;
}
return builder.toString();
}
}
🏚7.最长公共前缀
解题思路 首先取出第一个字符串,作为最长前缀a,遍历剩余的字符串,每遍历一个字符串,得到其与a的前缀并赋值给a。最终a就是所有字符串的最长前缀
代码
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0){return "";}
if(strs.length==1){return strs[0];}
String a=strs[0];
for(int i=1;i<strs.length;i++){
int j=0;
while(j<strs[i].length()&&j<a.length()){
if(strs[i].charAt(j)!=a.charAt(j)){break;}
j++;
}
a=a.substring(0,j);
}
return a;
}
}