日常打卡JAVA五道题(1.18)

009回文数

解析+代码

class Solution {
    public boolean isPalindrome(int x) {
        // 回文数,可以利用StringBuffer的reverse反转函数
        // 将n转换为StringBuffer类型
        StringBuffer s=new StringBuffer(String.valueOf(x));
        return s.reverse().toString().equals(String.valueOf(x));
        /*
        reverse方法实现字符串反转,StringBuffer有但是String没有
        String.valuOf方法实现转换为字符串类型功能
        toString将调用对象转换为字符串String类型
        equals用来比较两字符串是否相等
        */
    }
}

013罗马数字转整数

解析+代码

class Solution {
    public int romanToInt(String s) {
        /*
        题目重点:
        通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例
        */
        /*
        思路:
        通过变量num来记录整数
        逆序遍历字符串
        注意判断当前遍历的罗马数字是否比邻近的右边的罗马数字小
        如果比右边的小,则减
        否则加
        */
        // 记录整数
        int num=0;
        // 记录s的长度
        int length=s.length();
        // 求最后一个字符的罗马数字
        char rear=s.charAt(length-1);
        // 求最后一个字符的罗马数字对应的整数
        switch(rear){
                case 'I':
                    num=1;
                    break;
                case 'V':
                    num=5;
                    break;
                case 'X':
                    num=10;
                    break;
                case 'L':
                    num=50;
                    break; 
                case 'C':
                    num=100;
                    break;
                case 'D':
                    num=500;
                    break;
                case 'M':
                    num=1000;
                    break; 
        }
        // 字符串长度为1
        if(s.length()==1){
            return num;
        }
        // 字符串长度大于1
        else{
            // 记录当前遍历的罗马数字右边邻近的罗马数字对应的数字
            int index1=num;
            for(int i=length-2;i>=0;i--){
                // 记录当前遍历的罗马数字
                char front=s.charAt(i);
                // 记录当前罗马数字对应得数字
                int index2=0;
                // 求罗马数字对应的数字
                switch(front){
                case 'I':
                    index2=1;
                    break;
                case 'V':
                    index2=5;
                    break;
                case 'X':
                    index2=10;
                    break;
                case 'L':
                    index2=50;
                    break; 
                case 'C':
                    index2=100;
                    break;
                case 'D':
                    index2=500;
                    break;
                case 'M':
                    index2=1000;
                    break; 
                 }
                //  当前遍历的罗马数字小于右边邻近的数字时
                 if(index2<index1){
                    //  做减法
                     num-=index2;
                 }
                //  反之
                 else{
                    //  做加法
                     num+=index2;
                 }
                //  记录当前的罗马数字对应的数字
                 index1=index2;
            }
        }
        return num;
    }
}

014最长公共前缀

解析+代码

class Solution {
    public String longestCommonPrefix(String[] strs) {
        /*
        两个for循环
        第一个for循环:
        结束条件:第一个字符串中的长度或第二个for循环中遍历的字符不相等
        第二个for循环:
        结束条件:字符数组的长度或者遍历的字符不相等
        */
        int i=0,j=0;
        // 第一个for循环:
        // 遍历第一个字符串的字符
        for( ;i<strs[0].length();i++){
            // 记录当前遍历的字符
            char s=strs[0].charAt(i);
            // 第二个for循环:
            // 比较与第一个字符串相同下标的字符字符是否相同
            for(j=1;j<strs.length;j++){
                // 注意:容易犯错
                // 防止越界:因为不确定哪个字符串的长度最小
                if(i<strs[j].length()){
                    // 记录当前字符串的下标的字符
                    char ch=strs[j].charAt(i);
                    // 判断字符是否相同
                    if(ch!=s){
                        // 不相同结束
                        break;
                    }  
                }
                // 越界了
                else{
                    break;
                }
            }
            // 判断是否是两字符不相同结束
            if(j<strs.length){
                break;
            }
        }
        // 判断是否存在相同的前缀
        if(i>0){
            // 存在
            return strs[0].substring(0,i);
        }else{
            // 不存在
            return "";
        }
    }
}

020有效的括号

解析+代码

class Solution {
    public boolean isValid(String s) {
        //    考察知识点:栈
        // 先判断字符串的长度,奇数一定不是有效的
        // 记录字符串的长度
        int length=s.length();
        // 判断是否为奇数
        if(length%2!=0){
            // 奇数
            return false;
        }
        else{
            // 偶数
            // 创建栈
            // 注意要用包装类Character
            Stack<Character>stack=new Stack<Character>();
            // 遍历字符串
            for(int i=0;i<length;i++){
                // 记录当前遍历的字符串
                char ch=s.charAt(i);
                // 如果是(、{、[则入栈
                if(ch=='('||ch=='{'||ch=='['){
                    // 入栈push()
                    stack.push(ch);
                }
                // 如果不是,则要取栈顶字符判断
                else{
                    /*
                        易忘记考虑情况一:
                        }[]
                    */
                    // 如果为空栈
                    if(stack.size()==0){
                        return false;
                    }
                    // 不是空栈,判断字符是否相同
                    else if(stack.size()!=0){
                        // 取栈顶字符pop()
                        char t=stack.pop();
                        // 判断是否是[],{},()对应
                        if(t=='('&&ch!=')'||t=='['&&ch!=']'||t=='{'&&ch!='}'){
                            // 不是
                            return false;
                        }
                        else{
                            // 是则继续遍历
                            continue;
                        }
                    }
                }
            }
            /*
            易忘记考虑情况地方二:
            ")}"
            */
            // 判断是否为空栈
            if(stack.size()!=0){
                // 不是空栈
                return false;
            }else{
                // 是空栈
                return true;
            }
        }
        
    }
}

021合并两个有序链表

解析+代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 链表list1为空
        if(list1==null&&list2!=null){
            return list2;
        }
        // 链表list2为空
        else if(list1!=null&&list2==null){
            return list1;
        }
        // 两个链表都为空
        else if(list1==null&&list2==null){
            return null;
        }
        // 两个链表都不为空
        else{
            // 创建头结点
            ListNode head=new ListNode();
            ListNode node=head;
            // 遍历链表list1,list2
            while(list1!=null&&list2!=null){
                // 当前遍历list1的结点的val较小或者两者相等
                if(list1.val<=list2.val){
                    node.next=list1;
                    list1=list1.next;
                    node=node.next;
                }
                else{
                    node.next=list2;
                    list2=list2.next;
                    node=node.next;
                }
            }
            // 当list1未遍历完
            if(list1!=null){
                node.next=list1;
            }
            // 当list2未遍历完
            else if(list2!=null){
                node.next=list2;
            }
            return head.next;
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为2023年的OD机试目包含多个部分,其中有一个是“异常打卡Java”,是一道Java编程目。 目要求程序实现一个打卡系统,包含登录、签到、签退、查询历史记录等功能。要求使用Java语言编写,同时需要对程序中可能出现的异常进行处理,确保程序的稳定性和安全性。 对于这道目,我们可以从以下几个方面进行思考和实现: 第一,需要使用Java语言编写程序,其中涉及到Java基础语法、数据类型、运算符、流程控制等知识点。需要熟悉Java编程语言的基本规则和开发环境,如JDK、Eclipse等。 第二,需要实现一个打卡系统,包括用户登录、签到、签退、查询历史记录等功能。这需要用到Java的面向对象编程思想,通过定义类、对象、方法等来实现系统的功能。 第三,需要对程序中可能出现的异常进行处理,通过try-catch语句等方式来捕获异常,并进行相应的处理。需要能够识别和处理常见的异常类型,如空指针异常、数组越界异常等。 在实现上述功能的同时,还需要考虑程序的稳定性和安全性,例如防止SQL注入、XSS攻击等安全问。需要注意代码实现的效率和可读性,注重代码规范和注释,以便后续维护和更新。 总之,在华为OD2023机试中的异常打卡Java这一目中,我们需要综合运用Java编程知识和面向对象思想,能够处理程序中可能发生的异常,确保程序的稳定性和安全性。需要注重代码防御和安全性,同时需要考虑代码的可读性和规范性。这是一道具有一定难度和挑战性的Java编程目,但通过认真学习和练习,相信大家可以取得好的成绩。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值