输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer> > alal=new ArrayList<ArrayList<Integer> >();
for(int i=1;i<=sum/2;i++){
ArrayList<Integer> al=new ArrayList<Integer>();
int tempSum=i;
int nextNum=i;
al.add(i);
while(tempSum<sum){
nextNum++;
al.add(nextNum);
if((tempSum+=nextNum)==sum){
alal.add(al);
break;
}
}
}
return alal;
}
}
输出描述:
对应每个测试案例,输出两个数,小的先输出。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> al=new ArrayList<Integer>();
if(array==null||array.length<=2)
return al;
int i=0;
int j=array.length-1;
while(i<j){
if(array[i]+array[j]==sum){
al.add(array[i]);
al.add(array[j]);
return al;
}else if(array[i]+array[j]>sum){
j--;
}else{
i++;
}
}
return al;
}
}
public class Solution {
public String LeftRotateString(String str,int n) {
int len=str.length();
if(len==0) return "";
n=n%len;
str += str;
return str.substring(n,len+n);
}
}
public class Solution {
public String ReverseSentence(String str) {
if(str.trim().equals(""))
return str;
String[] s1=str.split(" ");
String s="";
for(int i=s1.length-1;i>0;i--){
s=s+s1[i]+" ";
}
s=s+s1[0];
return s;
}
}
import java.util.Arrays;
public class Solution {
public boolean isContinuous(int [] numbers) {
int numOfZero=0;
int numOfInterval=0;
int len=numbers.length;
if(len==0)
return false;
//进行数组排序
Arrays.sort(numbers);
for(int i=0;i<numbers.length-1;i++){
if(numbers[i]==0){
numOfZero++;
continue;
}
if(numbers[i]==numbers[i+1])
return false;
numOfInterval+=numbers[i+1]-numbers[i]-1;
}
if(numOfZero>=numOfInterval)
return true;
return false;
}
}
我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新 的约瑟夫环(以编号为k=m%n的人开始):
k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2并且从k开始报0。
现在我们把他们的编号做一下转换:
k --> 0
k+1 --> 1
k+2 --> 2
...
...
k-2 --> n-2
k-1 --> n-1
变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解: 例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情 况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x'=(x+k)%n。
代码:
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n==0)
return -1;
int s=0;
for(int i=2;i<=n;i++){
s=(s+m)%i;
}
return s;
}
}
47.求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
思路:
1.需利用逻辑与的短路特性实现递归终止。
2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0;
3.当n>0时,执行sum+=Sum_Solution(n-1),实现递归计算Sum_Solution(n)。
代码:
public class Solution {
public int Sum_Solution(int n) {
int sum=n;
boolean an=(n>0)&&((sum+=Sum_Solution(n-1))>0);
return sum;
}
}
48.写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路:
第一步:不进位加 n1
第二步:计算进位 n2
第三步:n1 和 n2求和(重复第一步,直到进位为0,即n2=0)
在第一步中,采用异或
第二步中,采用按位与,左移一位
代码:
public class Solution {
public int Add(int num1,int num2) {
if(num2==0)
return num1;
return Add(num1^num2,(num1&num2)<<1);
}
}
49.将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
思路:
这道题靠考虑到很多边界条件:
(1)字符串为空的情况;
(3)字符串含有非数字字符;
(2)字符串带正负号“+”、“-”,不含非数字字符;
(5)字符串不带正负号且为纯数字字符串;
(4)字符串只有正负号情况;
代码:
public class Solution {
public int StrToInt(String str) {
if (str.equals("") || str.length() == 0)
return 0;
char[] c=str.toCharArray();
int fuhao=0;
int sum=0;
if(c[0]=='-')
fuhao=1;
for(int i=fuhao;i<c.length;i++){
if(c[i]=='+')
continue;
if(c[i]<48||c[i]>57)
return 0;
sum=sum*10+c[i]-48;
}
return fuhao==0?sum:sum*-1;
}
}
50.在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
思路:
B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]
从左到右算 B[i]=A[0]*A[1]*...*A[i-1]
从右到左算B[i]*=A[i+1]*...*A[n-1]
代码:
import java.util.*;
public class Solution {
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;
// Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++
// 这里要特别注意~返回任意重复的一个,赋值duplication[0]
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null||numbers.length==0)
return false;
HashSet<Integer> set=new HashSet<Integer>();
for(int i=0;i<numbers.length;i++){
if(!set.add(numbers[i])){
duplication[0]=numbers[i];
return true;
}
}
return false;
}
}