2022-3-16 剑指offer day33

题1;

JZ61 扑克牌顺子

描述

现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
1. A为1,J为11,Q为12,K为13,A不能视为14
2. 大、小王为 0,0可以看作任意牌
3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]

要求:空间复杂度 O(1)O(1),时间复杂度 O(nlogn)O(nlogn),本题也有时间复杂度 O(n)O(n) 的解法
 

输入描述:

输入五张扑克牌的值

返回值描述:

五张扑克牌能否组成顺子。
 
 1 import java.util.*;
 2 public class Solution {
 3     public boolean IsContinuous(int [] numbers) {
 4         Arrays.sort(numbers);
 5         int count=0;
 6         int i=0;
 7         while (numbers[i]==0) {
 8             i++;
 9             count++;
10         }
11         int dis=0;
12         for (;i<numbers.length-1;i++) {
13             if (numbers[i]==numbers[i+1]) return false;
14             dis+=numbers[i+1]-numbers[i]-1;
15         }
16         return count>=dis;
17     }
18 }

思路:统计0的数量和要插入的数量。

 

题2:

JZ67 把字符串转换成整数(atoi)

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
1.若干空格
2.(可选)一个符号字符('+' 或 '-')
3. 数字,字母,符号,空格组成的字符串表达式
4. 若干空格
转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3  整数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1
4.去掉无用的后导空格

 
数据范围:
1.0 <=字符串长度<= 100
2.字符串由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成
 1 import java.util.*;
 2 
 3 
 4 public class Solution {
 5     /**
 6      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 7      *
 8      * 
 9      * @param s string字符串 
10      * @return int整型
11      */
12     public int StrToInt (String s) {
13         // write code here
14         String string=s.trim();
15         int sign=1;
16         long num=0;
17         for (int i=0;i<string.length();i++) {
18            char c=string.charAt(i);
19            if (i==0&&(c=='+'||c=='-')){
20                sign=c=='-'?-1:1;
21            }else if (c>='0'&&c<='9'){
22                num=num*10+(c-'0');
23                if (num>Integer.MAX_VALUE) break;
24            }else break;
25         }
26         num=sign*num;
27         if (num>Integer.MAX_VALUE) return Integer.MAX_VALUE;
28         if (num<Integer.MIN_VALUE) return Integer.MIN_VALUE;
29         return (int)num;
30     }
31 }

思路:模拟处理过程。

posted on 2022-03-16 09:44  阿ming  阅读(38)  评论(0)    收藏  举报

导航