您的位置:首页 > 职场人生

剑指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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐