41.和为S的连续正数序列
滑动窗口,如果小于目标值右端则向右滑动,大于目标值,左端向右滑动
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList();
int low =1;
int high=2;
while(low<high){
int temp = (low+high)*(high-low+1)/2;
if(temp==sum){
ArrayList<Integer> arr = new ArrayList();
for(int i = low;i<=high;i++){
arr.add(i);
}
res.add(arr);
high++;
}else if(temp>sum){
low++;
}else{
high++;
}
}
return res;
}
}
42.和为S的两个数字
滑动窗口,根据大小值的比较改变两个窗口的边界条件。
遇到的第一对就是乘积最小的结果。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> res = new ArrayList();
if(array.length==0){
return res;
}
int i =0;
int j = array.length-1;
while(i<j){
int temp = array[i]+array[j];
if(temp==sum){
res.add(array[i]);
res.add(array[j]);
break;
}else if(temp>sum){
j--;
}else{
i++;
}
}
return res;
}
}
43.左旋转字符串
画图可知。注意左旋转右旋转的转换。
public class Solution {
public String LeftRotateString(String str,int n) {
int len = str.length();
if(len==0){
return "";
}
int k = n%len;
k =len-k;
char[] cha = str.toCharArray();
change(cha,0,len-1);
change(cha,0,k-1);
change(cha,k,len-1);
return String.valueOf(cha);
}
public void change(char[] cha,int i ,int j ){
while(i<j){
char temp = cha[i];
cha[i] = cha[j];
cha[j] = temp;
i++;
j--;
}
}
}
44.反转单词顺序列
与上一道题类似,不过这次把每一个单词作为一个反转的对象。
public class Solution {
public String ReverseSentence(String str) {
StringBuilder sb =new StringBuilder();
String str1[] = str.split(" ");
if(str1.length==0){
return str;
}
change(str1,0,str1.length-1);
for(int i =0;i<str1.length-1;i++){
sb.append(str1[i]);
sb.append(" ");
}
sb.append(str1[str1.length-1]);
return sb.toString();
}
public void change(String[] str,int i ,int j ){
while(i<j){
String temp = str[i];
str[i] = str[j];
str[j] = temp;
i++;
j--;
}
}
}
45。扑克牌顺子
统计大小王的数量,统计需要补充空缺的长度,如果大小王的数量超过了空缺值,则可以成为顺子。
另外不可以有两张牌相等。
import java.util.*;
public class Solution {
public boolean isContinuous(int [] numbers) {
if(numbers.length==0){
return false;
}
int zero = 0;
int need = 0;
Arrays.sort(numbers);
for(int i =0;i<numbers.length-1;i++){
if(numbers[i]==0){
zero++;
continue;
}
if(numbers[i]==numbers[i+1]){
return false;
}
need+=numbers[i+1]-numbers[i]-1;
}
if(need<=zero){
return true;
}else{
return false;
}
}
}