首页 > 试题广场 >

最大数

[编程题]最大数
  • 热度指数:6035 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个包含大写英文字母和数字的句子,找出这个句子所包含的最大的十六进制整数,返回这个整数的值。数据保证该整数在int表示范围内

示例1

输入

"012345BZ16"

输出

1193051

说明

12345B对应十进制为1193051

备注:
0<字符串长度<=105
 public int solve (String s) {
        // write code here
    int max = 0;
	int sum = 0;
	for (int i = 0; i < s.length(); i++) {
		if (s.charAt(i) > 'F') {
			if (sum > max) {
				max = sum;
			}
			sum = 0;
			continue;
		}
	    int x = (s.charAt(i) >= 'A') ? 10 + s.charAt(i) - 'A' : s.charAt(i) - '0';
		sum = sum * 16 + x;
		}
		return max;
    }
发表于 2020-08-07 11:42:35 回复(0)
public int solve (String s) {
    List<String> listMatches = new ArrayList<String>();
    Matcher m = Pattern.compile("[0-9a-fA-F]+").matcher(s);
    while (m.find()) listMatches.add(m.group(0));
    Integer maxH = -1;
    for (String ele: listMatches) {
        if(ele.length() > 0){
            Integer t = Integer.parseInt(ele, 16);
            if(t > maxH) maxH = t;    
        }
    }
    return maxH.intValue();        
}
Java Regex 解法

发表于 2020-05-08 00:28:19 回复(1)
用0-9,A-F之外的字母去切割字符串,然后将切割后的子串全部转成十六进制数,取出最大值就可以了。注意在转化十六进制数的时候要去除空串和前导0。
class Solution:
    def solve(self , s ):
        # write code here
        import re
        array = []
        for num in re.split(r"[G-Z]", s):
            num = num.strip().lstrip('0')
            if num:
                array.append(int(num.strip().lstrip('0'), 16))
        return max(array)

编辑于 2021-05-19 09:26:15 回复(0)
class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int solve(string s) {
        // write code here
        int res = 0, max = 0;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= '0' && s[i] <= '9') res = res * 16 + (s[i] - '0');
            else if (s[i] >= 'A' && s[i] <= 'F') res = res * 16 + (s[i] - 'A' + 10);
            else res = 0;
            if (res > max) max = res;
        }
        return max;
    }
};

发表于 2020-10-12 22:19:12 回复(0)
class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int F(string t){
        int s=0;
        for(int i=0;i<t.length();i++){
            s *= 16;
            if(isdigit(t[i]))
                s += t[i]-'0';
            else
                s += t[i]-'A'+10;
        }
        return s;
    }
    int solve(string s) {
        int Max=0;
        string t="";
        for(int i=0;i<s.length();i++){
            if((s[i]>='0' && s[i]<='9') || (s[i]>='A' && s[i]<='F')){
                t += s[i];
            }else{
                Max = max(Max, F(t));
                t = "";
            }
        }
        if(t!="")
            Max = max(Max, F(t));
        return Max;
    }
};

发表于 2020-07-13 02:40:10 回复(0)
#
# 
# @param s string字符串 
# @return int整型
#
import re
class Solution:
    def solve(self, s):
        regex=re.compile(r"[0-9a-fA-F]+")
        ans=regex.findall(s)
        m=-1
        for i in ans:
            if(int(i,16)>m):
                m=int(i,16)
        return m

发表于 2020-06-13 22:32:55 回复(0)
# @param s string字符串 
# @return int整型
#
class Solution:
    def solve(self , s ):
        # write code here
        nums = []
        i=0
        for j in range(0,len(s)):
            if '0'<=s[j]<='9' or 'A'<=s[j]<='F':
                continue
            if i>j:continue
            nums.append(s[i:j])
            i=j+1
            while i<len(s):
                if not ('0'<=s[i]<='9' or 'A'<=s[i]<='F'):
                    i+=1
                    continue
                break
        res = 0
        for x in nums:
            if len(x)==0:continue
            res = max(res,int(x,16))
        return res

编辑于 2020-06-05 10:10:35 回复(0)
python正则一行:
import re # python3
print(max([int(i, base=16) if len(i) > 0 else 0 for i in re.split(r'[^0123456789ABCDEF]', input())]))


编辑于 2020-05-12 01:34:39 回复(0)
正则匹配0-9A-F的字符串,然后按长度降序排序,把最长的几个16进制字符串(降序后在数组开始位置)转10进制后选最大的。
function hex2int(hex){
 var len=hex.length,a=new Array(len),code;
    for (var i=0;i<len;i++){
        code = hex.charCodeAt(i);
        if (48<=code&&code<58){code-=48;}
                else{code=(code&0xdf)-65+10;}
        a[i]=code;
    }
    return a.reduce(function(acc,c) {acc=16*acc+c;return acc;},0);
 }
 function solve(s)
 {
	let array = s.match(/[1-9A-F][\dA-F]*/g);
	if (array==null){return 0;}
	array.sort((a,b)=>{return a.length-b.length}).reverse();
	let strLen = array[0].length;
	let arrLen = array.length;
	let hexArray = [];
	for(let i=0;i<arrLen;i++)
	 {
		if(array[i].length<strLen)break;
		hexArray.push(hex2int(array[i]));
	 }
	hexArray.sort().reverse();
	return hexArray[0];
 }

发表于 2020-03-28 23:00:02 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return int整型
 */
int solve(char* s ) {
    // write code here
    int sum=0;
    int max=0;
    for(int i=0;i<strlen(s)-1;i++)
    {
        if(s[i]>='0' &&s[i]<='F')
        {
            if(s[i]>='0'&&s[i]<='9')
            sum=sum*16+s[i]-'0';
            if(s[i]>='A'&&s[i]<='F')
            sum=sum*16+s[i]-'A'+10;
        }
      else
            sum=0;
        max=max>sum?max:sum;//使用max来防止最后出现>‘F’的字符,导致sum=0
    }
    return max;
}
发表于 2021-09-09 03:09:59 回复(0)
用到了递归,不过要修改默认递归深度
import sys
sys.setrecursionlimit(3000)


flag_num = 0
str_list = [chr(x) for x in range(65, 71)] + [str(y) for y in range(0, 10)]
target_list = []


class Solution:
    def solve(self, s):
        global flag_num
        pointer1 = pointer2 = flag_num
        while pointer1 < len(s) and s[pointer1] == '0':
            flag_num += 1
            pointer1 = pointer2 = flag_num
        while pointer2 < len(s) - 1 and s[pointer2] in str_list:
            pointer2 += 1
        if pointer1 != pointer2:
            target_list.append(s[pointer1:pointer2])
        if flag_num < len(s):
            flag_num = pointer2 + 1
            self.solve(s)
        res = max(target_list, key=lambda item: int(item, 16))
        return int(res, 16)


发表于 2021-08-21 11:36:26 回复(0)
func solve(s string) int {
    var res uint64 = 0
    max := 0
    for i := 0; i < len(s); i++ {
        if illegal(s[i]){
            continue
        }
        for j:=i+1;j<len(s);j++{
            if illegal(s[j]){
                tmp:=s[i:j]
                res ,_=strconv.ParseUint(tmp,16,32)
                if int(res)>max{
                    max=int(res)
                }
            }
        }
    }

    return max
}
func illegal(i byte) bool {
    if i == 48 || i == 49 || i == 50 || i == 51 || i == 52 || i == 53 || i == 54 || i == 55 || i == 56 || i == 57 || i == 65 || i == 66 || i == 67 || i == 68 || i == 69 || i == 70 {
        return false
    }
    return true
}
发表于 2021-06-04 18:46:56 回复(0)
大同小异吧,喜欢的可以看下

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int solve (String s) {
        
       int test = Integer.parseInt("1165",16);
        // write code here
        char[] chars = s.toCharArray();
        int maxNum = 0;
        
        for (int i = 0; i < chars.length; i++) {
            String numStr = "";
            for (int j = 0; j < chars.length - i; j++) {
                if (chars[i + j] > 'F') {
                    i = i + j;
                    break;
                } else {
                    numStr += chars[i+j];
                }
            }
            if (numStr == "") {
                continue;
            }
            int num = Integer.parseInt(numStr,16);
            maxNum = Math.max(num,maxNum);
        }
        return maxNum;
}}
发表于 2021-02-24 23:58:39 回复(0)
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int solve (String s) {
        // write code here
        int max = Integer.MIN_VALUE;
        StringBuilder sb = new StringBuilder();
        for(char c:s.toCharArray()){
            if((c>='0' && c<='9') || (c>='A' && c<='F')){
                sb.append(c);
            }else{
                if(sb.length()==0)continue;
                int m = Integer.parseInt(sb.toString(),16);
                max = Math.max(m,max);
                sb = new StringBuilder();
            }
        }
        return max;
    }
}

发表于 2021-02-22 11:07:25 回复(0)
function solve(s) {

    //16进制的正则
    let reg = /[0-9a-fA-F]+/g;
    let res = s.match(reg);//返回匹配的字符串数组
   

    //求10进制的最大值
    let max = 0;
    res.forEach(e => {
        // let temp = sum(e); 这是我自定义的求16进制整数
        let temp = parseInt(e16);
        if (max < temp) {
            max = temp;
        }
    });
    return max;
}
发表于 2020-08-24 13:43:51 回复(0)
class Solution:
    def solve(self , s ):
        # write code here
        res = ''.join(list(map(lambda x: x if 48<=ord(x)<=57&nbs***bsp;65<=ord(x)<=70 else "#", s)))
        res = res.split("#")
        res = list(map(lambda x:int(x, 16) if x != '' else 0, res))
        return max(res)
发表于 2020-08-20 23:16:17 回复(0)
class Solution:
    def solve(self , s ):
        # write code here
        if(s==None):
            return;
        _range=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
        s_splited = s[self.startSplit(s):]
        temp = []
        ts = ''
        for i in s_splited:
            if i in _range:
                ts+=i
            else:
                temp.append(ts)
                ts = ''
        return(max([int(i,16) for i in temp if i!='']))

    def startSplit(self,s_list):
        # 首个可表示十六进制字符下标
        _range=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
        for i in s_list:
            # print(i)
            if i in _range:
                return s_list.index(i)
                break
发表于 2020-07-26 20:20:56 回复(0)
从左到右遍历,若为0-9 A-F,cur = cur*16+当前元素值;若不是,cur置0,每次比较cur和存储的最大结果res。
keymap = [10,11,12,13,14,15]
class Solution:
    def solve(self , s ):
        # write code here
        if s is None&nbs***bsp;len(s)==0:
            return 0
        left = 0
        cur = 0
        res = 0
        while left<len(s):
            if "0"<=s[left]<="9":
                cur = cur*16+int(s[left])
                left+=1
            elif "A"<=s[left]<="F":
                cur = cur*16+keymap[ord(s[left])-ord("A")]
                left+=1
            else:
                cur = 0
                left+=1
            res = max(res,cur)
        return res

发表于 2020-07-13 15:12:55 回复(0)
用正则分解字符串,然后转成10进制 ,然后放进list中,排序搞定。代码未优化
public int solve (String s) {
        if(s==null || s.isEmpty()){
            return 0;
        }
        List<Integer> list = new ArrayList<Integer>();
        String [] st = s.split("[G-Z]");
        for (int i =0; i<st.length;i++){
            if(!st[i].isEmpty()){
                BigInteger in =  new BigInteger(st[i],16);
                int a = in.intValue();
                list.add(a);
            }            
        }
        Collections.sort(list);
        return list.get(list.size()-1);
    }
发表于 2020-07-01 14:22:50 回复(0)
    function solve(s) {
// write code here
var reg = new RegExp("[G-Z]+","g");
var arr = s.split(reg);
var max = 0;
for (let i of arr) {
if (parseInt(i, 16) > max) {
max = parseInt(i, 16);
}
}
return max;
}
编辑于 2020-04-21 14:42:24 回复(0)