yizishou
码龄14年
求更新 关注
提问 私信
  • 博客:95,109
    问答:57,214
    152,323
    总访问量
  • 11
    原创
  • 26
    粉丝
  • 6
    关注
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:西藏
加入CSDN时间: 2011-01-25
博客简介:

yizishou的博客

查看详细资料
个人成就
  • 获得54次点赞
  • 内容获得23次评论
  • 获得97次收藏
  • 代码片获得364次分享
  • 博客总排名659,155名
创作历程
  • 1篇
    2022年
  • 8篇
    2017年
  • 3篇
    2016年
成就勋章
TA的专栏
  • Linux
    1篇
  • SparkSQL
    2篇
  • JVM
    2篇
  • 翻译
    1篇
  • Java语言
    4篇
  • 正则表达式
    1篇
  • bitmap
    2篇

TA关注的专栏 0

TA关注的收藏夹 0

TA关注的社区 0

TA参与的活动 0

创作活动更多

新星杯·14天创作挑战营·第13期

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你们参加为期14天的创作挑战赛!注: 1、参赛者可以进入活动群进行交流、互相鼓励与支持(开卷),虚竹哥会分享创作心得和涨粉心得,答疑及活动群请见:https://bbs.csdn.net/topics/619781944 【进活动群,得奖概率会更大,因为有辅导】 2、文章质量分查询:https://www.csdn.net/qc

89人参与 去参加
  • 最近
  • 文章
  • 专栏
  • 代码仓
  • 资源
  • 收藏
  • 关注/订阅/互动
更多
  • 最近

  • 文章

  • 专栏

  • 代码仓

  • 资源

  • 收藏

  • 关注/订阅/互动

  • 社区

  • 帖子

  • 问答

  • 课程

  • 视频

搜索 取消

Java/这个怎么写代码怎么写

答:

典型的算法题。

  • 定义:f(n)为(0,n]之间数字2的个数,
  • 则题目要求的:[n1,n2]之间数字2的个数 = f(n2) - f(n1-1)。

所以,算法核心是实现 f(n) 函数。
下面给个数学分析思路,使用递归实现代码逻辑。

数学分析:

假设N是个四位数,从高到低写为abcd,则f(N)是以下3部分之和:

  1. 从0000递增到a000,低3位出现2的总次数,等于(a+1) * f(999) 次
  2. 从a000递增到abcd,低3位出现2的总次数,等于f(bcd) 次
  3. 从0000递增到abcd,最高位出现2的次数,分两种情况:
    a. 如果a>2,则最高位出现2的总次数=1000次,即从2000到2999;
    b. 如果a==2,则最高位出现2的总次数=(bcd +1)次,即从2000到2bcd;

根据上面的分析,递归算法就写出来了:

private static int f(int n) {
    if (n >= 10) {
        int base = baseOf(n);
        int n1 = n / base;
        int n2 = n % base;
        return f(base - 1) * n1 + (n1 > 2 ? base : n1 == 2 ? (n2 + 1) : 0) + f(n2);
    }
    return n >= 2 ? 1 : 0;
}

private static int baseOf(int n) {
    int base = 1;
    while (n >= 10) {
        n /= 10;
        base *= 10;
    }
    return base;
}

验证结果:

img

回答问题 2024.05.17

RoaringBitmap数据结构及原理

首先每个RoaringBitmap(GitHub链接)中都包含一个RoaringArray,名字叫highLowContainer。 highLowContainer存储了RoaringBitmap中的全部数据。RoaringArray highLowContainer;这个名字意味着,会将32位的整形(int)拆分成高16位和低16位两部分(两个short)来处理。RoaringArray的数据
原创
博文更新于 2023.04.28 ·
32878 阅读 ·
27 点赞 ·
7 评论 ·
52 收藏

深入浅出认识awk

awk是Unix-like系统常用的文本处理工具。其功能可总结为:将输入文本切成表格,通过行筛选、字段重组、跨行上下文、逻辑判断等灵活组合,实现定制化输出。
原创
博文更新于 2022.02.08 ·
7997 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java enum 枚举类的编译实现

本文探讨一下enum枚举类和普通的class有什么区别,在编译时又有什么不同。并详细分析枚举的编译
原创
博文更新于 2022.02.08 ·
3508 阅读 ·
5 点赞 ·
1 评论 ·
2 收藏

hsdis-amd64.dll

发布资源 2016.12.01 ·
dll

在64位Windows上编译hsdis

反汇编Hotspot的JIT的机器码需要hsdis,但是适配windows64位版本的资料却比较难找。本文提供了在windows上build hsdis的方法,希望帮助大家顺利拿到hsdis-amd64.dll
原创
博文更新于 2019.05.15 ·
9523 阅读 ·
10 点赞 ·
7 评论 ·
18 收藏

EWAHCompressedBitmap数据结构及原理

EWAH 意思是 Enhanced Word-Aligned Hybrid,在WAH基础上优化而来。本文介绍了EWAH的Java实现javaewah项目中的核心类EWAHCompressedBitmap的数据结构和运行原理,并进行了一些分析,希望对读者有些帮助
原创
博文更新于 2018.08.14 ·
9553 阅读 ·
7 点赞 ·
0 评论 ·
12 收藏

JVM Synchronized实现的问题

答:

mark word在对象头里。首先在oop.hpp中,

class oopDesc {
  friend class VMStructs;
 private:
  volatile markOop  _mark;
  union _metadata {
    wideKlassOop    _klass;
    narrowOop       _compressed_klass;
  } _metadata;
... 

看到_mark了吧,接下来看markOop.hpp,你要的都在里面了。

接下来是monitor record,我没怎么听到这个词组,搜了一下,一下子就找到了你看的文章。。按照我的理解,可能的原因是,作者读的不是Hotspot的源码。。

不要纠结了,殊途同归,可以按照他的思路在Hotspot中作对照,加油

回答问题 2018.03.01

从源码中分析HashMap的get跟put方法

答:

首先你要知道HashMap最基本的原理,就是把要存储的所有键做Hash,映射到一个数组中去。

但是有可能两个甚至更多的键映射到了同一个位置,因此HashMap需要解决的最核心的问题就来了,就是“哈希冲突”。

jdk7及以前的做法比较简单,如果出现哈希冲突,就在出现冲突的数组位置上创建一个链表,存储所有冲突的对象。这样的问题是,如果冲突的对象很多,那么这个链表会很长,会导致HashMap的性能大大下降。

因此在jdk8发布的时候做了一个优化,在冲突较少的时候依然使用链表,冲突较多的时候,就把链表转换成一棵红黑树。

这也就是你在看代码的时候看到的Node(链表节点)和TreeNode(红黑树节点)。

回答问题 2018.01.30

偏向锁 ,synchronized相关的

答:

偏向锁信息是记录在对象头中的。当对象处于偏向锁状态时,它的对象头中的_mark字段中会记录它所偏向的线程的指针,因此被偏向的线程访问对象时只需要验证对象头,没有同步操作;

当锁膨胀之后,对象头的_mark字段记录的就是指向锁对象的指针了

回答问题 2018.01.30

javacv 引起的jvm报错,怎么解决?

答:

错误信息太少啦。。。你截取的信息看不出什么,有用的信息在下面呢

回答问题 2017.12.11

JVM crash 错误日志分析

答:

根据java官方文档(链接),这个问题可能是由于Win7或Win Vista的UAC导致的。

至于你的问题,可能是你使用JNA访问本地类库的时候发生了访问权限的问题,但JNA没有很好地处理这个问题。

你可以试试升级一下JNA版本,或者暂时关闭UAC(关闭方法可以自行搜索)。

回答问题 2017.12.11

JVM VMError::report_and_die()+0x2ba 求解答

答:

这个问题看起来是JVM启动过程中发生的。

更具体一点,是初始化堆中的PSOld区域时,申请的内存大小(根据日志可知是1431830528 bytes, 1.33GB)超出操作系统剩余的可用内存大小。

不是什么严重的问题,启动JVM的时候把内存调小一点就好了,就是把-Xmx和-Xms调小一点。

回答问题 2017.12.11

单个JVM进程也能利用机器超大内存

答:

这是Java NIO的特性。

通过管道传输数据,而不是通过流,这样可以避免数据在Java堆中的拷贝,提高效率。

这样说吧,你可以将磁盘上的文件看做一个管道,而将网卡看做另外一个管道,通过Java代码直接控制这两个管道接通,之后的数据传输则自发进行。

如果是使用数据流,那么你需要将文件内容读入Java堆,然后将堆中数据写入网卡,数据在Java堆中的进出是消耗时间的。

如果你想关注这方面的东西,可以了解一下这些关键字:零拷贝、Linux管道

回答问题 2017.11.10

AngularJs1和angular-ui-route.js,点击导航栏切换页面,滚动条每次都会置顶

答:

你看下切换到新的页面的时候旧的页面是销毁掉了还是隐藏掉了。。要是销毁掉了(用的ng-if),那么再切回去的时候重新渲染,肯定不会保留上次浏览位置的。用样式隐藏掉试试

还有,问题不要提在java分类下面。。

回答问题 2017.09.06

正则表达式的匹配与截取重组

答:
String str = "CSDN__hello__1/2/3";
str.replaceAll("CSDN[_a-z]*([\\d/]++)[_a-z]*", "CSDN_$1");
回答问题 2017.07.25

文本中是否包含手机号 正则表达式

答:

如果你知道手机号的正则,那么验证是否包含手机号就很简单了。

比如,如果你要用的手机号正则是:1[3|4|5|7|8][0-9]{9},
那么只需要在前面加上.*,后面也加上.*,就能验证是否包含手机号了。

即:.*1[3|4|5|7|8][0-9]{9}.*

.*能够匹配任意字符(某些情况下不包含换行符)。

回答问题 2017.06.30

用正则表达式进行复杂密码校验

复杂密码的正则表达式校验。比如1. 包含大写字母、小写字母、数字、特殊符号中的至少多少种2. 至少包含多少个数字,或者至少包含多少个字母3. 长度在多少到多少之间
原创
博文更新于 2017.06.28 ·
6866 阅读 ·
2 点赞 ·
1 评论 ·
9 收藏

正则表达式求助~ ~

答:

你试试:
如果是Java,使用:

^(?!([a-z]*|[A-Z]*|[\d]*|[\p{Punct}]*|[a-zA-Z]*|[a-z\d]*|[a-z\p{Punct}]*|[A-Z\d]*|[A-Z\p{Punct}]*|[\d\p{Punct}]*)$)[a-zA-Z\d\p{Punct}]{8,}$

如果不是Java,就把上面所有的\p{Punct}换成

!"#\$%&'()*+,\-\./:;<=>?@\[\\\]^_`{|}~
回答问题 2017.06.26

JAVA代码中黄色警告清理问题

答:

如果你能够认真看每一条警告,并且了解了可能会出现的问题,你的Java水平会得到很大的提升,你会发现你写出的代码警告越来越少,质量越来越高。感谢你的领导吧。

我来给你解释一下,为什么要重视IDE的黄色警告,能够帮你避免什么样严重的问题:

  1. 防止资源泄露。比如创建了文件流但是未关闭,可能会在运行时占用掉大量的文件句柄,导致系统卡顿,甚至崩溃。数据库连接也一样。
  2. 辅助类型检查。如果你的List没有指定泛型,那么任何对象都有可能会被放进List中,这就可能导致使用时的强制类型转换出错。
  3. 代码可达性分析。编译器检测到你写了一个绝对不会执行到的代码,会警告你,比如你写了

    if (isWoman = true) { // 你能看出来你写的是=而不是==吗?
    print("woman");
    } else { // 编译器会在else代码块给出警告,因为不可达
    print("man");
    }
    
  4. 空值检测。如果编译器在检测了所有情况之后认为,你使用的这个变量在这里一定是null,会给你警告。你要考虑一下是不是忘了赋值,或者写错了变量名。

  5. switch case缺失。如果一个枚举定义了4个值,但是你在对这个枚举的对象进行switch的时候只写了其中三个case,且没有default,编译器会提醒你是不是忘了写另一个case。

先想到这么多。

另外,希望你不要用敌对的眼光去看这些警告,它们努力帮你的样子,还是挺可爱的。

回答问题 2017.06.26
加载更多