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

面试题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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值