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;
}