第1章:双指针
1.和为 S 的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
返回值描述: 输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
public ArrayList<ArrayList > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(sum<3){
return res;
}
int start = 1;
int end = 2;
int res_sum = 3;
while(start<end){
if(sum > res_sum){
end++;
res_sum = res_sum + end;
}
else if(sum<res_sum){
res_sum = res_sum-start;
start++;
}
else{
res.add(result(start,end));
res_sum = res_sum-start;
start++;
end++;
res_sum = res_sum+end;
}
}
return res;
}
public ArrayList<Integer> result(int start,int end){
ArrayList<Integer> list = new ArrayList<>();
for(int i=start;i<=end;i++){
list.add(i);
}
return list;
}
2.翻转单词顺序列
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
示例1
输入
"nowcoder. a am I" 返回值
"I am a nowcoder." public String ReverseSentence(String str) { int n = str.length();
int i = 0;
int j = 0;
char[] chars = str.toCharArray();
while(j<=n){
if(j==n||chars[j]==' '){
reverse(chars,i,j-1);
i = j+1;
}
j++;
}
reverse(chars,0,n-1);
return new String(chars);
}
private void reverse(char[] chars,int i,int j){
while(i<j){
swap(chars,i,j);
i++;
j--;
}
}
private void swap(char[] chars,int i,int j){
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
3 左旋转字符串
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
示例1
输入
"abcXYZdef",3 返回值
"XYZdefabc" public String LeftRotateString(String str,int n) {
if (n >= str.length()) return str;
char[] array = str.toCharArray();
int len = str.length();
reverse(array,0,len-1);
reverse(array,0,len-n-1);
reverse(array,len-n,len-1);
return new String(array);
}
private void reverse(char[] c, int i, int j) { while (i < j){ swap(c, i++, j--); } }
private void swap(char[] c, int i, int j) { char t = c[i]; c[i] = c[j]; c[j] = t; } public String LeftRotateString(String str,int n) { if (n >= str.length()) return str; return str.substring(n)+str.substring(0,n); }