LeetCode171--表示数值的字符串(O20)、调整数组顺序使奇数位于偶数前面(O21)、数值的整数次方(O16)、打印1到最大的n位数(O17)

1、表示数值的字符串

//请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
//
// 数值(按顺序)可以分成以下几个部分:
//
//
// 若干空格
// 一个 小数 或者 整数
// (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
// 若干空格
//
//
// 小数(按顺序)可以分成以下几个部分:
//
//
// (可选)一个符号字符(’+’ 或 ‘-’)
// 下述格式之一:
//
// 至少一位数字,后面跟着一个点 ‘.’
// 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
// 一个点 ‘.’ ,后面跟着至少一位数字
//
//
//
//
// 整数(按顺序)可以分成以下几个部分:
//
//
// (可选)一个符号字符(’+’ 或 ‘-’)
// 至少一位数字
//
//
// 部分数值列举如下:
//
//
// ["+100", “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”]
//
//
// 部分非数值列举如下:
//
//
// [“12e”, “1a3.14”, “1.2.3”, “±5”, “12e+5.4”]
//
//
//
//
// 示例 1:
//
//
//输入:s = “0”
//输出:true
//
//
// 示例 2:
//
//
//输入:s = “e”
//输出:false
//
//
// 示例 3:
//
//
//输入:s = “.”
//输出:false
//
// 示例 4:
//
//
//输入:s = " .1 "
//输出:true
//
//
//
//
// 提示:
//
//
// 1 <= s.length <= 20
// s 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,空格 ’ ’ 或者点 ‘.’ 。
//
// Related Topics 字符串

由于需要讨论各种情况,我们通过几个标志符来判断不同的情况,一个是看见数字标志符numSeen、小数点标志符dotSeen、e标志符eSeen,然后我们需要讨论遇到点的时候前面不能出现e和小数点,在遇到e的时候前面不能有重复的e而且需要有数字,一旦遇到e需要保证后面也有数字。遇到‘+’、’-'时需要注意他们要么是第一个字符要么是e后面第一个字符。

public boolean isNumber(String s) {
        if(s == null || s.length() == 0){
            return false;
        }
        //标记是否遇到相应的情况
        boolean numSeen = false;
        boolean dotSeen = false;
        boolean eSeen = false;
        //trim()用于删除字符串头尾的空白符
        char[] chars = s.trim().toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if(chars[i] >= '0' && chars[i] <= '9'){
                numSeen = true;
            }else if(chars[i] == '.'){
                //小数点前面不能出现e和其他小数点
                if(dotSeen || eSeen){
                    return false;
                }else{
                    dotSeen = true;
                }
            }else if(chars[i] == 'e' || chars[i] == 'E'){
                //如果前面不存在任何数字或者有重复的e出现则不符合要求
                if(!numSeen || eSeen){
                    return false;
                }else{
                    eSeen = true;
                    //这样可以确保e后面也存在数字
                    numSeen = false;
                }
            }else if(chars[i] == '+' || chars[i] == '-'){
                if(i != 0 && chars[i-1] != 'e' && chars[i-1] != 'E'){
                    return false;
                }
            //这里肯定是出现了什么奇怪的其他字符
            }else{
                return false;
            }
        }
        return numSeen;
    }

2、调整数组顺序使奇数位于偶数前面

//输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
//
//
//
// 示例:
//
//
//输入:nums = [1,2,3,4]
//输出:[1,3,2,4]
//注:[3,1,2,4] 也是正确的答案之一。
//
//
//
// 提示:
//
//
// 0 <= nums.length <= 50000
// 1 <= nums[i] <= 10000
//
// Related Topics 数组 双指针 排序

将前半段的偶数和后半段的奇数进行对调。

public int[] exchange(int[] nums) {
        int i = 0, j = nums.length-1;
        while(i < j){
            if(nums[i] % 2 == 0 && nums[j] % 2 == 1){
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                i++;
                j--;
            }else if(nums[i] % 2 == 1 && nums[j] % 2 == 0){
                i++;
                j--;
            }else if(nums[i] % 2 == 0){
                j--;
            }else{
                i++;
            }
        }
        return nums;
    }

3、数值的整数次方

//实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
//
//
//
// 示例 1:
//
//
//输入:x = 2.00000, n = 10
//输出:1024.00000
//
//
// 示例 2:
//
//
//输入:x = 2.10000, n = 3
//输出:9.26100
//
// 示例 3:
//
//
//输入:x = 2.00000, n = -2
//输出:0.25000
//解释:2-2 = 1/22 = 1/4 = 0.25
//
//
//
// 提示:
//
//
// -100.0 < x < 100.0
// -231 <= n <= 231-1
// -104 <= xn <= 104
//
//
//
//
// 注意:本题与主站 50 题相同:https://leetcode-cn.com/problems/powx-n/
// Related Topics 递归 数学

我们将它要做的幂转换成二进制,比如9->1001,所以9 = 1*2^0+0*2^1+0*2^2+1*2^3

x^9=x^1*x^0*x^0*x^8

所以我们通过将幂的二进制移位,每移动一次都是将前面算出来的整数次方算一个平方,如果当前是1,那么就乘上去

public double myPow(double x, int n) {
        if(x == 0)return 0;
        long b = n;
        double res = 1.0;
        if(b < 0){
            x = 1/x;
            b = -b;
        }
        //x^9 = x^(1*1)*x^(0*2)*x^(0*4)*x^(1*8)
        while(b > 0){
            if((b & 1) == 1)res *= x;
            x *= x;
            b >>= 1;
        }
        return res;
    }

4、打印1到最大的n位数

//输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
//
// 示例 1:
//
// 输入: n = 1
//输出: [1,2,3,4,5,6,7,8,9]
//
//
//
//
// 说明:
//
//
// 用返回一个整数列表来代替打印
// n 为正整数
//
// Related Topics 数组 数学

public int[] printNumbers(int n) {
        int num = 10;
        while(n > 1){
            num *= 10;
            n--;
        }
        int[] ints = new int[num -1];
        for (int i = 0; i < ints.length; i++) {
            ints[i] = i+1;
        }
        return ints;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值