面试题41:和为s的两个数字VS和为s的连续正序列
public class Test41 {
private class Number{
int intValue;
}
public boolean FindNumbersWithSum(int[] data,int sum,Number num1,Number num2){
boolean found=false;
if (data==null||data.length<1)
{
return found;
}
int length=data.length;
int ahead=length-1;
int behind=0;
while (ahead>behind)
{
long curSum=data[ahead]+data[behind];
if (curSum==sum)
{
num1.intValue=data[ahead];
num2.intValue=data[behind];
found=true;
break;
}else if(curSum>sum)
{
ahead--;
}else {
behind++;
}
}
return found;
}
private void FindContinuousSequence(int sum) {
if (sum<3) {
return;
}
int small=1;
int big=2;
int middle=(1+sum)/2;
int curSum=small+big;
while (small<middle)
{
if (curSum==sum)
{
PrintContinuousSequence(small,big);
}
while (curSum>sum&&small<middle)
{
curSum-=small;
small++;
if (curSum==sum)
{
PrintContinuousSequence(small,big);
}
}
big++;
curSum+=big;
}
}
private void PrintContinuousSequence(int small, int big) {
for (int i = small; i <=big; i++) {
System.out.print(i+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] data={1,2,4,7,11,15};
Test41 t=new Test41();
Number num1=t.new Number();
Number num2=t.new Number();
t.FindNumbersWithSum(data, 15, num1, num2);
System.out.println(num1.intValue+","+num2.intValue);
t.FindContinuousSequence(15);
}
}
面试题42:翻转单词顺序VS左旋转字符串
public class Test42 {
private void Reverse(char[] chars,int pBegin,int pEnd){
if (chars==null) {
return;
}
while (pBegin<pEnd) {
char temp=chars[pBegin];
chars[pBegin]=chars[pEnd];
chars[pEnd]=temp;
pBegin++;
pEnd--;
}
}
public String ReverseSentence(String data){
if (data==null) {
return null;
}
char[] chars=data.toCharArray();
int pBegin=0;
int length=chars.length;
int pEnd=length-1;
Reverse(chars, pBegin, pEnd);
pBegin=pEnd=0;
while (pBegin!=length-1) {
if (chars[pBegin]==' ') {
pBegin++;
pEnd++;
}else if (chars[pEnd]==' '||pEnd==length-1) {
Reverse(chars, pBegin, --pEnd);
pBegin=++pEnd;
}else {
pEnd++;
}
}
return String.valueOf(chars);
}
public String leftRotateString(String pStr,int n){
char[] chars=null;
if (pStr!=null) {
int length=pStr.length();
if (length>0&&n>0&&n<length) {
chars=pStr.toCharArray();
int pFirstStart=0;
int pFirstSEnd=n-1;
int pSecondStart=n;
int pSecondEnd=length-1;
Reverse(chars, pFirstStart, pFirstSEnd);
Reverse(chars, pSecondStart, pSecondEnd);
Reverse(chars, pFirstStart, pSecondEnd);
}
return String.valueOf(chars);
}
return null;
}
public static void main(String[] args) {
String data="I am a student.";
String pStr="abcdefg";
Test42 t=new Test42();
String reverseString=t.ReverseSentence(data);
System.out.println(reverseString);
String leftRotateString=t.leftRotateString(pStr, 2);
System.out.println(leftRotateString);
}
}
面试题43:n个骰子的点数
public class Test43 {
int g_maxValue=6;
public void PrintProbability(int number){
if (number<1) {
return;
}
int[][] pProbabilitys=new int[2][g_maxValue*number+1];
int flag=0;
for (int i = 1; i <=g_maxValue; i++) {
pProbabilitys[flag][i]=1;
}
for (int k = 2; k <=number; k++)
{
for (int i = 0; i < k; i++) {
pProbabilitys[1-flag][i]=0;
}
for (int i = k; i <=g_maxValue*number; i++)
{
pProbabilitys[1-flag][i]=0;
for (int j = 1; j <=i&&j<=g_maxValue; j++)
{
pProbabilitys[1-flag][i]+=pProbabilitys[flag][i-j];
}
}
flag=1-flag;
}
double total=Math.pow(g_maxValue, number);
for (int i = 0; i <=g_maxValue*number; i++) {
double ratio=pProbabilitys[flag][i]/total;
System.out.println(i+": "+ratio);
}
}
public static void main(String[] args) {
Test43 t=new Test43();
t.PrintProbability(6);
}
}
面试题44:扑克牌的顺子
import java.util.Arrays;
public class Test44 {
public boolean IsContinuous(int[] numbers) {
if (numbers == null || numbers.length < 1) {
return false;
}
int length=numbers.length;
Arrays.sort(numbers);
int numbersOfZero=0;
int numberOfGap=0;
for (int i = 0; i < length && numbers[i]==0; i++) {
++numbersOfZero;
}
int small=numbersOfZero;
int big=small+1;
while (big<length) {
if (numbers[small]==numbers[big]) {
return false;
}
numberOfGap+=numbers[big]-numbers[small]-1;
small=big;
++big;
}
return numberOfGap>numbersOfZero?false:true;
}
public static void main(String[] args) {
Test44 t=new Test44();
int[] numbers={3,0,4,5,0,8};
boolean flag=t.IsContinuous(numbers);
System.out.println(flag);
}
}
面试题45:圆圈中最后剩下的数字
public class Test45 {
public int LastRemaining(int n,int m) throws Exception {
if (n<1||m<1) {
throw new Exception("invalid input");
}
int last=0;
for (int i = 2; i <=n; i++) {
last=(last+m)%i;
}
return last;
}
public static void main(String[] args) throws Exception {
Test45 t=new Test45();
int n=t.LastRemaining(5, 3);
System.out.println(n);
}
}