刷题的臭皮匠第一周的小试

    秋招告一段落,浮躁的少年终于成长,最大的收获就是终于真正强烈地想要尝试去坚持一件事。第一周的刷题经历非常有趣,有一个小目标真的会给人动力,每天都会惦记着有件事还没完成,非得完成才能睡个安稳觉。昨天是宝宝满8个月的日子,我希望作为一个里程碑,开启我的博客之旅。也希望随着宝宝一天天长大,她和我都能见证彼此的成长。出乎我意料的是,这并不是一件讨厌的事或不情愿开启的任务,睡前刷题有一种很和谐的氛围,看着宝宝香甜地进入梦乡,我便能开始安心地专注起来。

    这周的题目都是随机从牛客网找的,摆脱了IDE,徒手码的感觉很酷。又刚好难度循序渐进,使我慢慢树立起了信心。有时候顺利解完一题,开心之余再去看高手的解答,这个过程很是酸爽。简单总结一些点,以便积累和日后参考。

叭>>>java中的类型转换问题

大家都知道Java1.5引入自动拆装箱方便了基本类型的使用。做编程题真的是刷新了我的认识,Integer.parseInt(str, 16)居然就是十六进制转十进制的正解,当时看到这个解答真的要哭了。我的解答:先获取字串长度,然后开辟两个整型数组,一个用来放16的幂们,另一个用来放字串各位数字,字母转换为10~15,然后就逐位相乘累积求和,可谓是辛苦的办法了。这里利用强转会变成ASCII码的特性,找到大写字母与数字之间的差值,即Integer.valueOf(chArray [i])- 55,就能得到相应的数值了。同理大小写也是要通过32这个差来转换。还遇到过char转int的需求,要用这两种方法Integer.parseInt(new String( {numChar} )) 或 Character.getNumericValue(numChar),表示已经不记得有这样的操作了。此外,求16的幂也不需要自己去累乘a[0]=1; a[i]=a[i-1]*16,直接用Math.pow(16,i)即可。

叭>>>集合类型的妙用

第一个场景是实现数据去重和排序,我条件反射就想到用Set去重用Collections.sort()排序,但是,其实,用TreeSet就一举两得,所以说还是对TreeMap和TreeSet理解得不好。这里遇到一个想不通的事情,while(scan.hasNext()){ }必须包裹在最外层才能运行成功,不知道和写在里面有什么区别。

然后,我就开始滥用TreeMap了。。按递增顺序输出一个long型整数的所有质因子。我在想啊2,2,2,3,3,5这种东西要怎么存,Set肯定不行,TreeMap的话默认将按照key值进行升序排序,不会按value排序,但是key又不能重复。。所以还是灰溜溜的回去用数组吧,毕竟数组才是根本,最好用了。

关于质因子,我真是死脑筋啊,非要去维护一个质数数组,真是单纯容易上当受骗啊。上次笔试有道题是证明哥德巴赫猜想:任一大于2的偶数都可写成两个质数之和。这个就必须维护一个质数集合了。自从学了位图法(倒排索引)之后就经常拿来用,真的不要太好用。跟朱老师学了一波穷举质数法,就是开一个很大的boolean数组,初始化为true(假设全是质数)。把0、1置为false,从2开始,2是质数,而所有2的倍数都不是质数;3是质数,而所有3的倍数都不是质数... ...每次都是从头开始扫描,扫到第一个为true的数为质数,并将它的倍数全部置为false,这样指针走得越来越快,很快就能将一定范围内的质数全部找出来,效率极高。而我们只需要遍历大于2的偶数,用一个bool变量去记录每个偶数是否可以拆分为两个质数。对于每个偶数都先假设不可以,然后让他们依次去减所有小于自己的质数,一旦存在差也是质数就记为可以,检验完毕跳出循环。如果直到减到差为负值了还是不行,也检验完毕跳出循环。然后综合看,如果这个数不行就证明猜想不成立,直接结束。如果行,那还需要检查下一个数... ...直到所有数都检查完成,都没有退出程序,才能证明猜想成立。ps:今天又丢了次人,还去找大神的错误。。我想成,先假设所有偶数都可以,然后一旦发现某个偶数不可以,就跳出循环下结论,直到检查完所有数都可以才证明猜想成立。就以为大神的true和false写反了。有了这道题的经验,我上来就写求质数,好不容易写出来了,和原版一对比还是有差距。

我的:

boolean[] b = new boolean[lenth];

int i=0, j=0;
for(i=0;i<lenth;i++)
    b[i] = true;

b[0]=false;
b[1]=false;
i=0;

while(i<lenth){
  if(b[i]){
     j=i+i;
     while(j<lenth){
        b[j]=false;
         j+=i;
      }
   }
   i++;
}

大神的:

boolean[] a = new boolean[RANGE + 1];

int i, j;
a[0] = false;
a[1] = false;
a[2] = true;
primeNums.add(2);
for (i = 4; i <= RANGE; i += 2)
a[i] = false;
for (i = 3; i <= RANGE; i += 2)
a[i] = true;
i = 3;
while (i <= RANGE) {
while (i <= RANGE && !a[i])
i++;
if (i <= RANGE)
primeNums.add(i);
for (j = i + i; j <= RANGE; j += i) {
a[j] = false;
}
i++;
}

首先,不需要初始化。其次,大于2的偶数全不是质数,大于1的奇数有很大可能性是质数,这两步预处理是一个优化。

回到求质因子的问题,我求质数根本就是无用功。

先po答案:

long n = scan.nextLong();
int i = 2;
while(n!= 1){
while(n%i == 0){
System.out.print(i +" ");
n = n / i;
}
i ++;
}

就是这么简单。

转载于:https://www.cnblogs.com/guoyari/p/7828360.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值