算法挑战记录Ⅱ——Java

本文记录了多个Java实现的算法挑战,包括合法标识符、合法文章、出现次数最多的字母等,涉及字符串处理、数学计算及区间管理。通过实例解析算法思路与实现,帮助读者深入理解Java算法应用。
摘要由CSDN通过智能技术生成

算法挑战记录Ⅱ——Java

  • 不知不觉挑战数量已经超过了10个,第一篇也已经写了600多行,不好阅读也不好维护,因此开始第二篇的写作。开始于2020-11-18.

第一篇地址算法挑战记录——Java


11.合法标识符

描述

  • 请判断字符串 str 是不是一个合法的标识符。
    合法的标识符由字母(A-Z,a-z)、数字(0-9)和下划线组成,并且首字符不能为数字。

样例

输入:str = "123_abc"
输出:false
解释:
虽然 "123_abc" 由字母、数字和下划线组成,但是它的首字符为数字。

思路

  • 首先进行空判断
  • 判断首字符是否为数字
  • 逐字符判断是否为下划线、数字、字母。
  • 算法如下,时间复杂度O(n),额外空间复杂度O(1)
public class Solution {
   
    /**
     * @param str: The identifier need to be judged.
     * @return: Return if str is a legal identifier.
     */
    public boolean isLegalIdentifier(String str) {
   
        // Write your code here.
        if (str.length() == 0)
            return false;
        if ('0'<=str.charAt(0) && '9'>=str.charAt(0)) return false;
        for (int i=0;i<str.length() ;i++ ){
   
            char c = str.charAt(i);
            if ('_' == c){
   
                continue;
            }
            if ('0'<=c && '9'>=c){
   
                continue;
            }
            if ('A'<=c && 'Z'>=c){
   
                continue;
            }
            if ('a'<=c && 'z'>=c){
   
                continue;
            }
            return false;
        }
        return true;
    }
}

12.合法文章

描述

  • 请判断字符串 str 是不是一个合法的标识符。
    合法的标识符由字母(A-Z,a-z)、数字(0-9)和下划线组成,并且首字符不能为数字。

样例

输入: s="This won iz correkt. It has, No Mistakes et Oll. But there are two BIG mistakes in this sentence. and here is one more."
输出: 3
解释:
'BIG' 中'I'和''G',以及最后一句话中的第一个字母不合法.

思路

  • 用.拆分句子(注意需要用\\.来进行拆分)。
  • [ ,]来拆分每一句的单词,当有连用情况时,拆分后的结果可能为"",需要进行空字符串检查。
  • 根据规则,需要检查每句第一个字符是否为大写
  • 随后字符检查是否为大写。
  • 算法如下,时间复杂度O(n),额外空间复杂度O(n)
public class Solution {
   
    /**
     * @param s: the article
     * @return: the number of letters that are illegal
     */
    public int count(String s) {
   
        // Write your code here.
        String[] list=s.split("\\.");
        int sum = 0;
        for (int i= 0;i<list.length ; i++){
   
            if(list[i].length() == 0) continue;
            
            System.out.println(list[i]);
            String[] line = list[i].trim().split("[ ,]");
            boolean checkFirst = false;
            for (int j= 0;j< line.length;j++){
   
                if(line[j].length() == 0) continue;
                char c = line[j].charAt(0);
                
                
                for (int k =1; k <line[j].length();k++){
   
                    char n = line[j].charAt(k);
                    if(n >='A' && n <='Z') {
   
                        sum ++;
                    }
                }
                
                if (!checkFirst){
   
                    if (c >='A' && c <='Z') {
   
                        checkFirst = true;
                        continue;
                    }
                    sum ++;
                    checkFirst = true;
                }
            }
        }
        return sum;
    }
}

13.出现次数最多的字母

描述

  • 给定一个字符串str,现在你需要统计出现次数最多的字母。返回这个字母出现的次数。
  • 字母中只可能会出现大写字母或者小写字母。
    字符串长度不超过100000

样例

输入: str="ABCabcA"
输出: 2
解释:
A出现了2次,B出现了1次,C出现了1次,a出现了1次,b出现了1次,c出现了1次,A出现的次数最多,所以返回2。

思路

  • 想到总共只有52个字符,因此可以通过一个数组来统计每个字符出现的次数
  • 利用大小写字母ASCII码的特性来确定索引
  • 最后再遍历数组即可找到最大出现字母数量。</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值