Java经典算法——回文数和java.lang.UnsupportedOperationException异常源码分析

package com.hitsys.bayonet.action;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
 *  回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
 *  示例 1:                    示例 2:                                                                                                                     示例 3:
        输入:x = 121    输入:x = -121                                               输入:x = 10
        输出:true       输出:false                                                  输出:false
                                         解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。       解释:从右向左读, 为 01 。因此它不是一个回文数。
 * @author james
 *
 */
public class Test
{
    public static void main(String[] args)
    {
        boolean palindrome1 = isPalindrome1(1001);
        System.out.println(palindrome1);
        boolean palindrome = isPalindrome(10200201);
        System.out.println(palindrome);
    }
}

(1)第一种解法


    public static boolean isPalindrome1(int x)
    {
        int  a = 0;
        int c = x;
        //当 x 对  10取余=0的时候肯定不是回文数 比如:100  排除特殊情况 0
        if(x % 10 == 0 && x != 0)
        {
            return false;
        }
        //排除 x<0 的情况
        while (x>0)
        {
            //通过对10取余拿到个位上的值
            int b = x % 10;
            /**
             * 每次让 a 的值 扩大10 倍再加上个位的值  
             * 刚好把数字从个位数往前颠倒过来
             **/
            a = a * 10 + b;   
            /*
             * 因为int是整数类型  
             * 所以可以去掉已经获取到的个位数
             * 下一次取个位数 就是取这一次的十位数
             * */ 
            x = x / 10;
        }
        //再次判断 a的值是否与 传进来的值相等
        if(c == a)
        {
            return true;
        }
        return false;
    }

(2)第二种解法(效率比较低仅作参考)


    public static boolean isPalindrome(int x) {
        //当 x 对  10取余=0的时候肯定不是回文数 比如:100  排除特殊情况 0
        if(x%10 ==0 && x!=0)
        {
            return false;
        }
        //把 int 转换为 string类型
        String a = String.valueOf(x);
        //把string类型转换为数组 并添加到list集合里边去
        List<String> d = Arrays.asList(a.split(""));
        /**
         *   java.util.Arrays
         * 不转换为java.util.List<String>
         * 会报错:java.lang.UnsupportedOperationException
         * 具体原因往下看
         */
        List<String>  b= new ArrayList<String>(d);
        //创建一个长度为c的数组 便于根据下标去放数据
        String [] c=new String[b.size()];
        StringBuffer s=new StringBuffer();
        //获取 b里面最后一位数
        String string = b.get(b.size()-1).toString();
        //判断传进来的数字第一位和最后一位是否相等  不相等直接false
        if(b.get(0).equals(string))
        {
            //for 循环不设置i自增 设置 i =0
            for (int i = 0; i <= b.size()-1; )
            {
                //不停的获取 b里面的第一位数字 并把他的值给 c的最后一位
                c[b.size()-1]=b.get(i).toString();
                //删除已经添加的元素
                b.remove(i);
            }  
            //循环把 结果里面的值拼接为一个字符串
            for (int i = 0; i < c.length; i++)
            {
                s.append(c[i]);
            }
            //判断两个字符串是否相等
            if(s.toString().equals(a))
            {
                return true;
            }
        }
        return false;
    }

java.lang.UnsupportedOperationException异常原因及解决方案:

这个异常是写上边第二种解法时候遇到的,记录一下。

(1)异常原因:

点进去之后发现java.util.Arrays里面的asList,返回的是一个ArrayList,而ArrayList又继承了AbstractList方法。

在这里插入图片描述

AbstractList里面的add、remove方法是默认抛出 java.lang.UnsupportedOperationException异常。
在这里插入图片描述

(2)解决方案:

java.util.ArrayList重写了父类AbstractListadd、remove方法。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

public class ListTest {
    public static void main(String[] args) {
        String[] array = {"6","8","24"};
        List<String> list = Arrays.asList(array);
        List arrList = new ArrayList(list);
        arrList.add("9");
    }
}

文章仅用作分享记录,如有不当之处,还望指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿爱篮球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值