文章目录
一、翻转单词顺序
1.1题目
示例1:
示例2:
示例3:
1.2代码
思路:利用trim()函数去掉首尾空格,substring()拦截器,StringBuilder拼接字符串
class Solution {
public String reverseWords(String s) {
s=s.trim();
int j=s.length()-1,i=j;
StringBuilder sb=new StringBuilder();
while(i>=0){
while(i>=0&&(s.charAt(i)!=' '))i--;
sb.append(s.substring(i+1,j+1)+' ');
while(i>=0&&(s.charAt(i)==' '))i--;
j=i;
}
return sb.toString().trim();
}
}
二、和为s的连续正数序列
2.1题目
示例1:
示例 2:
2.2代码
思路1:
这个题面试官肯定会让你尝试新的解法
思路2:
class Solution {
public int[][] findContinuousSequence(int target) {
int i=1,j=2,s=3;
List<int[]> list=new ArrayList<>();
while(i<j){
if(s==target){
int a[]=new int[j-i+1];
for(int k=i;k<=j;k++){
a[k-i]=k;
}
list.add(a);
}
if(s>=target){
s=s-i;
i++;
}
else{
j++;
s=s+j;
}
}
return list.toArray(new int [0][]);
}
}
三、第一个只出现一次的字符
3.1题目
示例 1:
示例 2:
3.2代码
方案一
可用HashMap key唯一的关键
class Solution {
public char firstUniqChar(String s) {
char a=' ';
if(s.length()==0||s==null) return a;
HashMap<Character,Integer> map=new HashMap<>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(map.containsKey(c)){
map.put(c,map.get(c)+1);
}else map.put(c,1);
}
for(int i=0;i<s.length();i++){
if(map.get(s.charAt(i))==1){
return s.charAt(i);
}
}
return a;
}
}
方案二
因为只存储26个英文字母的小写 可以利用数组来存储
例如 a[0]=1,a[1]=0,表示第一个字母出现1次 第二个字母出现0次
class Solution {
public char firstUniqChar(String s) {
if(s == null || s.length() == 0) return ' ';
int[] count = new int['z' - 'a' + 1]; //因为s只包含了小写字母
for(int i = 0;i < s.length();i++){
count[s.charAt(i) - 'a'] ++;
}
for(int i = 0;i < s.length();i++){
if(count[s.charAt(i) - 'a'] == 1)
return s.charAt(i);
}
return ' ';
}
}
四、圆圈中最后剩下的数字(约瑟夫环)
4.1题目
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例 1:
示例 2:
4.2代码
这个题重要的思路得对 像我就想了半天没有想出来!!!需要用到动态规划的知识
代码:
class Solution {
public int lastRemaining(int n, int m) {
int ans=0;
for(int i=2;i<=n;i++){
ans=(ans+m)%i;
}
return ans;
}
}