剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
2017-07-30 15:21
1356 查看
面试题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); } }
相关文章推荐
- 剑指Offer_面试题42_翻转单词顺序 VS 左旋转字符串
- 剑指offer-面试题41-和为s的两个数字VS和为s的连续正数序列
- 剑指Offer面试题42:翻转单词顺序;左旋转字符串 Java实现
- [剑指offer][面试题41]和为s的两个数字 VS 和为s的连续正数序列
- 剑指offer之面试题41和为s的两个数字VS和为s的连续正数序列
- 剑指offer-面试题42:翻转单词顺序VS左旋转字符串
- 剑指offer 面试题42 翻转单词顺序 VS 左旋转字符串
- 【剑指offer】面试题42-翻转单词顺序VS左旋转字符串
- [剑指offer][面试题42]翻转单词顺序 VS 左旋转字符串
- 剑指offer——面试题41:和为s的两个数字VS和为s的连续正数序列
- 剑指Offer_面试题41_和为s的两个数字 VS 和为s的连续正数序列
- 【剑指offer】6.3知识迁移能力——面试题41:和为s的两个数字VS和为s的连续正数序列
- 剑指offer 面试题42 翻转单词顺序 | 左旋转字符串
- 【剑指offer】面试题42:单词翻转顺序&左右旋转字符串
- 【剑指Offer学习】【面试题41:和为s 的两个数字vs 和为s 的连续正数序列】
- 【剑指offer】6.3知识迁移能力——面试题42:翻转单词顺序VS左旋转字符串
- 剑指offer-面试题42-翻转单词顺序VS左旋转字符串
- 【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串】
- 剑指offer-面试题41:和为s的两个数字VS和为s的连续正数序列
- 剑指Offer-面试题41-和为s 的两个数字vs 和为s 的连续正数序列