剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串

来源:互联网 发布:什么是核函数 知乎 编辑:程序博客网 时间:2024/06/01 07:54

面试题41:和为s的两个数字,和为s的连续正数序列

问题1:输入一个递增排序的数组和一个数字s.在数组中查找两个数使他们的和为s,如果有多对数字的和等于s,输出任意一对即可。
思路:固定一个数字然后遍历其它数字的复杂度O(n^2)的方法肯定不好,注意这是递增的数组,可以2个指针分别指向开头末尾,即最小最大的数,然后判断和是否等于s,若小于s,则前边的指针后移,若大于s,后边的指针前移。一个循环即可复杂度O(n)。
问题2:输入一个整数s,打印出所有和为s的连续正数序列(至少含有两个数)。
思路:有了前边的思路,我们可以先初始化最小值为1和最大值为2,求和判断,若小于s,则增大最大值使序列包含更多值,现在序列变为{1,2,3},若大于s,则要去掉序列中的小值,即增大最小值。
Java实现如下:

public class FindNumbersWithSum {    // 问题1    static void q1(int[] arr,int s){        if(arr == null)            return;        int small = 0;        int big = arr.length-1;        while(big > small){            if(arr[small] + arr[big] == s){                System.out.println(arr[small]);                System.out.println(arr[big]);                break;            }else if(arr[small] + arr[big] > s){                big--;            }else{                small++;            }        }    }    // 问题2    static void q2(int s){        if(s < 3)            return;        int small = 1;        int big = 2;        int mid = (s + 1) / 2;        int curSum = small + big;        while(small < mid){            if(curSum == s){                for(int i=small;i<=big;i++)                    System.out.println(i);                curSum -= small;                small++;            }else if(curSum > s){                curSum -= small;                small++;            }else{                big++;                curSum += big;            }        }    }    public static void main(String[] args) {        int[] test = {1,2,4,7,11,15};        q1(test,15);        q2(15);    }}

面试题42:翻转单词顺序,左旋转字符串

题目1:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
思路:写一个翻转字符串的函数,先翻转整个句子,再翻转每个单词。
题目2:实现字符串左旋,比如输入abcdefg和数字2,输出cdefgab。
思路:同理,先翻转整个句子,再翻转两个字串。
Java实现如下:

public class ReverseSentence {    // 翻转字符串的函数    static String reverse(String str){        if(str == null)            return null;        char[] arr = str.toCharArray();        for(int i=0;i<(arr.length+1)/2;i++){            char tmp = arr[i];            arr[i] = arr[arr.length-i-1];            arr[arr.length-i-1] = tmp;        }        return String.valueOf(arr);    }    // 题目1    static void q1(String str){        if(str == null)            return;        String tmp = reverse(str);        String[] items = tmp.split(" ");        StringBuilder sb = new StringBuilder();        for(String item : items){            sb.append(reverse(item) + " ");        }        System.out.println(sb.toString());;    }    // 题目2    static void q2(String str,int n){        if(str == null || n > str.length() || n < 0)            return ;        String tmp = reverse(str);        String[] items = {tmp.substring(0, tmp.length()-n), tmp.substring(tmp.length()-n, tmp.length())};        StringBuilder sb = new StringBuilder();        for(String item : items){            sb.append(reverse(item));        }        System.out.println(sb.toString());    }    public static void main(String[] args) {        q1("I am your father!");        q2("woyouyijummp",5);    }}
阅读全文
0 0