第1章:双指针

208 阅读1分钟

第1章:双指针

1.和为 S 的连续正数序列

www.cyc2018.xyz

题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出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.翻转单词顺序列

www.cyc2018.xyz

题目描述

牛客最近来了一个新员工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 左旋转字符串

www.cyc2018.xyz

题目描述

汇编语言中有一种移位指令叫做循环左移(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); }