【每日编程Day30】最难的问题 && 因子个数

目录

一、选择题

二、编程题

1、最难的问题

2、因子个数


一、选择题

 

(1)当包装类与基本数据类型比较,包装类会自动茶香变为基本数据类型再比较;

(2)包装数据类直接赋值,默认调用其对用的valueOf()方法。那么Integer i03=Integer.valueOf(59);就等价于Integer i01=59;valueOf()操作-128 ~ 127之内的整型,在第一次引用,会在缓存中new一个对象;再次引用,直接从缓存中查找;操作-128 ~ 127之外的整型,则每次都要new一个对象。也就是说如果已经创建了一个-128 ~ 127之间的整数,使用valueOf创建第二次时,不会使用new关键字,而用已经缓存的对象。因此System.out.println(i01i03);输出true。

(3)包装类是基础数据类型的引用类型,i04的定义使用了new关键字,这会开辟出一块新内存来放置值为59的Integer对象。那么两个地址不同的引用类型变量进行==判断结果自然是false。

笔试强训day30_考虑下面这个简单的例子, [单选题5分 public class dumpmethods( publ_@~007的博客-CSDN博客
  一道关于Integer的笔试题_Sweetie77的博客-CSDN博客

 Java中String类型变量是immutable(不可变的)。
        尽管 change()方法中的str与sv.str都是实例成员变量值"6"的引用, 由于String类型的 不可变性,change()方法中的str="10"语句实际上是将传入的str副本引用指向了一个值为“10”的新的内存地址,但原数据引用 sv.str的引用值(也就是“6”的内存地址)并没有发生改变,因此sv.str指向的值仍旧为6。


        这种情况下则是将srt指向的地址的值从1改成了2,而不是直接将str的副本引用指向一个新地址。


 

 这种情况则是将str的副本引用指向了一个新的内存地址,但原数据引用sv.str并不受影响。笔试强训day30_考虑下面这个简单的例子, [单选题5分 public class dumpmethods( publ_@~007的博客-CSDN博客

Java内存管理大杂烩_还能坚持的博客-CSDN博客


二、编程题

1、最难的问题

 

 思路:

遍历字符串:如果是大写字母就进行变换,否则说明是空格直接拼接;

由于题目中说了只有大写字母和空格,所以问题1可以忽略 。

问题1:怎么判断是大写字母?

        ASCII:大写字母的范围是65-94 int a = Integer.valueOf(char)

问题2:如果是大写字母,就进行转化:

(1)如果要解密的密码字母在A-E之间,则其对应的原文值=密码字母+21;

(2)否则:原文值=密码字母-5;

 public static void main(String[] args) {        
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()){
            //1、获取输入的字符串
            String str = sc.nextLine();
            //2、定义一个字符串容器,用来拼接解密后的字符
            StringBuilder sb = new StringBuilder();
            //2、遍历字符串,获取字符:判断字符的所属类型
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                //如果是空格,直接拼接
                if(c == ' '){
                    sb.append(" ");
                }else{
                    //说明是大写字母
                    //判断大写字母的类型:是大于E的情:注意这里-5或者+21之后要转为char类型
                    if(c > 'E'){
                        sb.append((char)(c-5));
                    }else{
                        //是A-E的情况
                        sb.append((char)(c+21));
                    }
                }
            }
            System.out.println(sb);
        }
    }

2、因子个数

 一开始题目都没有读懂,不理解示例的结果为什么是这样的?

后来发现这里的因子指的是质因子:
 

 思路:

        理解一个数是由若干个素数乘积得来的,那么我们可以从小到大进行枚举,如果n能够被整除,则将n中所有的该因子都除尽,并将n更新为除尽后的数,然后枚举下一个数以此类推。当然,如果n本身就是一个素数,最终n的值会大于1,所以最后还需要判断n是否为1,如果不为1因子还包括n本身,计数需要加1。

【算法刷题日记之本手篇】最难的问题与因子个数_未见花闻的博客-CSDN博客

public static void main(String[] args) {
        //1、获取输入数据
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
           int n = sc.nextInt();
           //2、定义变量count
            int count = 0;
            for (int i = 2; i < Math.sqrt(n); i++) {
                //3、因为不能重复计数,所以先算符合因子数的个数
                if(n % i == 0){
                    count++;
                }
                //4、更新n的值
                while (n % i == 0){
                    n/=i;
                }
            }
            //5、判断n值是否为1:如果不为1说明该数字是一个质数,因子数包含n本身,计数要加1
            if(n!=1){
                count++;
            }
            System.out.println(count);
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_48479056/article/details/131401867