剑指offer题解10

剑指offer题解10

    • 44 圆圈中剩下最后的数
    • 45 求1+2+3...+n
    • 46 不用加减乘除做加法
    • 47 把字符串转换成整数

44 圆圈中剩下最后的数

题目描述
随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

分析:约瑟夫环问题,使用数组或者链表模拟一个环即可。

import java.util.ArrayList;
public class Solution {
    public int LastRemaining_Solution(int n, int m) {
        //防御
        if(n<=0||m<=0){
            return -1;
        }
        ArrayList<Integer> list=new ArrayList<>();
        //模拟环以及数
        int index=0;
        for(int i=0;i<n;i++){
            list.add(i);
        }
        //轮流删除
        while(list.size()>1){
            index=(index+m-1)%list.size();
            list.remove(index);
        }
        return list.get(0);
        
    }
}

45 求1+2+3…+n

题目描述
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

分析:没有任何意思,使用短路即可

public class Solution {
    public int Sum_Solution(int n) {
        int sum=n;
        //n>0作为递归的边界条件
        boolean flag = (n>0) && ((sum+=Sum_Solution(n-1))>0);
        return sum;
    }
}

46 不用加减乘除做加法

题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

分析:将数转换为二进制思考,进位的时候:两个数对应的位置相等,那么此位的数可以向上一位进位(使用&运算求出);那么进位后剩余的呢:使用亦或求出不相同的位,直到某一个数为0

public class Solution {
    public int Add(int num1,int num2) {
        while(num2!=0){
            //剩余的
            int temp=num1^num2;
            //进位的
            num2=(num1&num2)<<1;
            num1=temp;
        }
        return num1;
    }
}

47 把字符串转换成整数

题目描述
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。

输入描述:
输入一个字符串,包括数字字母符号,可以为空

输出描述:
如果是合法的数值表达则返回该数字,否则返回0

分析:字符串遍历处理即可,判断是否合法

public class Solution {
    public int StrToInt(String str) {
        
        if(str==null||"".equals(str)){
            return 0;
        }
        boolean neg=false;
        int i=0;
        //判断+,-或者没有符号开始
        char[] cs=str.toCharArray();
        if(cs[0]=='-'){
            neg=true;
            i=1;
        }else if(cs[0]=='+'){
            i=1;
        }
        //防止溢出
        long res=0;
        for(;i<cs.length;i++){
            if(cs[i]<'0'||cs[i]>'9'){
                return 0;
            }
            res=res*10+cs[i]-'0';
        }
        if(neg){
            res=-res;
        }
        return res<Integer.MIN_VALUE||res>Integer.MAX_VALUE ? 0 : (int)res;
    }
}

你可能感兴趣的:(算法题)