精华内容
下载资源
问答
  • Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. Example 1: Input: haystack = "hello", needle = "ll" Output: 2 Exa...

    题目

    Implement strStr().

    Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

    Example 1:

    Input: haystack = "hello", needle = "ll"
    Output: 2
    

    Example 2:

    Input: haystack = "aaaaa", needle = "bba"
    Output: -1
    

    Clarification:

    What should we return when needle is an empty string? This is a great question to ask during an interview.

    For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf().

    我的尝试

    本来打算在线性时间实现,但是需要KMP算法实现,KMP算法研究过思路,但是写出来目前不具备能力,先考虑非线性的实现吧,毕竟题目没有要求必需线性时间。

    package com.puhui.flowplatform;
    
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
    
        public static  int findNeedle(String haystack,String needle) {
            if (needle.equalsIgnoreCase("")){
                return 0;
            }
            if (haystack.equalsIgnoreCase("")){
                return -1;
            }
            int count=0;
            for(int i=0,j=0;i<haystack.length()&&j<needle.length();i++){
                //相等与否i都移动,j相同才移动,如何计算整个匹配?
                if(haystack.charAt(i)==needle.charAt(j)){
                    count++;
                    j++;
                }
                else{
                    count=0;
                }
                if (count==needle.length()){
                    return i-count+1;
                }
            }
            return -1;
    
        }
    
    
    
        public static void  main(String[] args){
    
            String hayStack="mississippi";
            String needle="issip";
            System.out.println(findNeedle(hayStack,needle));
    
    
    
        }
    }

    写完之后,自认为完美,但是其实我忽略了一个重要的问题,我的hello中寻找ll这个case测试通过,但是在leetcode中提交没有通过,因为忽略了指针回溯的问题。比如mississippi中寻找issip,这个时候我i的循环已经过了第二个匹配的开始,i指针不能一直增加,如果部分匹配前缀的情况出现,那么j=0,i=i-count(此处不需要加1,因为for循环会自动加1),count=0,重新计数

    修改后的代码如下,leetcode已经接受,就是时间复杂度有点高:

    package com.puhui.flowplatform;
    
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
    
        public static  int findNeedle(String haystack,String needle) {
            if (needle.equalsIgnoreCase("")){
                return 0;
            }
            if (haystack.equalsIgnoreCase("")){
                return -1;
            }
            int count=0;
            int j=0;
            for(int i=0;i<haystack.length()&&j<needle.length();i++){
                //相等与否i都移动(错误的,i不同时移动,相同时需要考虑回溯),j相同才移动,如何计算整个匹配,引入count计数
                if(haystack.charAt(i)==needle.charAt(j)){
                    count++;
                    j++;
                }
                else{
                    if(count!=0){
                        //发生过部分前缀匹配,计数清零,指针回溯,注意i在for循环加1了已经,所以这个回溯不需要加1
                        i=i-count;
                        j=0;
                        count=0;
                    }
    
                }
                if (count==needle.length()){
                    return i-count+1;
                }
            }
            return -1;
    
        }
    
    
    
        public static void  main(String[] args){
    
            String hayStack="mississippi";
            String needle="pi";
            System.out.println(findNeedle(hayStack,needle));
    
    
    
        }
    }

    展开全文
  • ··· public class Main { public static void main(String[] args) { String a = "abc"; String b = "abcdef"; System.out.println(Idx(a, b)); String c = "abc,,def";... String d = "abc";...
    public class Main {
        public static void main(String[] args) {
    
            String a = "abc";
            String b = "abcdef";
            System.out.println(Idx(a, b));
            String c = "abc,,def";
            String d = "abc";
            System.out.println(Idx(c,d));
            String e=null;
            String f="ccc";
            System.out.println(Idx(e,f));
    
        }
    
        public static int Idx(String str1, String str2) {
            if (str1 == null || str1.length() < 1 || str2 == null || str2.length() < 1) {
                return -1;
            }
            if (str1.length() < str2.length()) {
                return -1;
            }
            char[] str_1 = str1.toCharArray();
            char[] str_2 = str2.toCharArray();
            for (int i = 0; i < str_1.length; i++) {
                boolean find = false;
                if (str_1[i] == str_2[0] && i + str_2.length <= str_1.length) {
                    int equalcount = 1;
                    for (int j = 1; j < str_2.length; j++) {
                        if (str_1[i + j] == str_2[j]) {
                            equalcount++;
                        }
                    }
                    if (equalcount == str_2.length) {
                        find = true;
                    }
                }
                if (find) {
                    return i;
                }
    
            }
            return -1;
        }
    
    }
    
    
    展开全文
  • Java里的indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。 //可用于json串里检索是否包含特定返回值,包含则返回位置,否则返回-1 JsonObject.indexOf("freezeValidityDays")>0 从头到尾地...

    Java里的indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

    //可用于json串里检索是否包含特定返回值,包含则返回位置,否则返回-1
    if(JsonObject.indexOf("date")>0)
    

    从头到尾地检索字符串 stringObject,看它是否含有子串 value。开始检索的位置在字符串的 fromindex 处或字符串的开头(没有指定 fromindex 时)。如果找到一个 value,则返回 value 的第一次出现的位置。stringObject 中的字符位置是从 0 开始的,取值是从0到stringObject.length-1。

    注意:indexOf() 方法区分大小写

    展开全文
  • java里的String.indexOf(String str,int fromIndex)方法我用过之后很奇怪: String s="ddzdz",d="s"; for(int w=0;w<5;w++) System.out.println(s.indexOf("z", w)); 结果是 2 2 2 4 4 w设置为在...
  • 一个调皮读者在之前我写“我去”系列文章留言调侃说,“二哥,你是无中生小王吗?”不不不,其实真不是,小王是真实存在,他一直和我并肩作战,不辞辛劳,让我既爱又恨。我爱他,因为他兢兢业业,任劳任怨...

    cae47a8bc7a731a74e85cbc8b6f20fcd.png
    先看再点赞,给自己一点思考的时间,微信搜索【沉默王二】关注这个靠才华苟且的程序员。
    本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章。

    一个调皮的读者在之前我写的“我去”系列文章里留言调侃说,“二哥,你是无中生小王吗?”不不不,其实真不是的,小王是真实存在的,他一直和我并肩作战,不辞辛劳,让我既爱又恨。我爱他,因为他兢兢业业,任劳任怨,和我心有灵犀;我恨他,因为他时不时会中二一下,问我一些可笑的问题,比如说这次,“二哥,你能给我说说 Java 如何生成 UUID 吗?”

    UUID,全名叫做 Universally Unique Identifier,也就是通用唯一标识符的意思。有时候,也叫做全局唯一标识符,英文全名叫做 Globally Unique Identifier,简拼为 GUID。

    来看一下 UUID 的格式:

    123e4567-e89b-12d3-a456-556642440000
    xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
    

    由四个中划线“-”隔开,第一部分的长度为 8,第二部分和第三部分的长度为 4,第四部分的长度为 12,总长度为 36,是固定的。每一部分都是一个十六进制的数字,注意并不是随机的任意字母+数字的字符串。

    M 表示 UUID 的版本,N 为 UUID 的变体(Variants)。

    M 的值有 5 个可选项:

    • 版本 1:UUID 是根据时间和 MAC 地址生成的;
    • 版本 2:UUID 是根据标识符(通常是组或用户 ID)、时间和节点 ID生成的;
    • 版本 3:UUID 是通过散列(MD5 作为散列算法)名字空间(namespace)标识符和名称生成的;
    • 版本 4 - UUID 使用随机性或伪随机性生成;
    • 版本 5 类似于版本 3(SHA1 作为散列算法)。

    为了能兼容过去的 UUID,以及应对未来的变化,因此有了变体(Variants)这一概念。

    目前已知的变体有下面 4 种:

    • 变体 0:格式为 0xxx,为了向后兼容预留。
    • 变体 1:格式为 10xx,当前正在使用的。
    • 变体 2:格式为 11xx,为早期微软的 GUID 预留。
    • 变体 3:格式为 111x,为将来的扩展预留,目前暂未使用。

    在上例中,M 是 1,N 是 a(二进制为 1010,符合 10xx 的格式),这就意味着这个 UUID 是“版本 1”、“变体 1”的 UUID。

    目前大多数使用的 UUID 大都是变体 1,N 的取值是 8、9、a、b 中的一个。

    System.out.println(Integer.toBinaryString(Integer.valueOf("8",16))); // 1000
    System.out.println(Integer.toBinaryString(Integer.valueOf("a",16))); // 1010
    System.out.println(Integer.toBinaryString(Integer.valueOf("9",16))); // 1001
    System.out.println(Integer.toBinaryString(Integer.valueOf("b",16))); // 1011
    

    8 的二进制为 1000,9 的二进制为 1001,a 的二进制为 1010,b 的二进制为 1011,都符合 10xx 的格式。

    由于 UUID 是全局唯一的,重复 UUID 的概率接近零,可以忽略不计。所以 Java 的 UUID 通常可用于以下地方:

    • 随机生成的文件名;
    • Java Web 应用程序的 sessionID;
    • 数据库表的主键;
    • 事务 ID(UUID 生成算法非常高效,每台计算机每秒高达 1000 万次)。

    在 Java 中,就有一个叫 UUID 的类,在 java.util 包下。

    package java.util;
    public final class UUID implements java.io.Serializable, Comparable<UUID> {
    }
    

    该类只有一个构造方法:

    public UUID(long mostSigBits, long leastSigBits) {
        this.mostSigBits = mostSigBits;
        this.leastSigBits = leastSigBits;
    }
    

    要使用构造方法创建 UUID 对象的话,就需要传递两个参数,long 型的最高位 UUID 和最低位的 UUID。

    long msb = System.currentTimeMillis();
    long lsb = System.currentTimeMillis();
    UUID uuidConstructor = new UUID(msb, lsb);
    System.out.println("UUID : "+uuidConstructor);
    

    输出结果如下所示:

    UUID : 00000173-8efd-1b7c-0000-01738efd1b7c
    

    UUID 类提供了一个静态方法 randomUUID()

    public static UUID randomUUID() {
        SecureRandom ng = UUID.Holder.numberGenerator;
    
        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6]  &= 0x0f;  /* clear version        */
        randomBytes[6]  |= 0x40;  /* set to version 4     */
        randomBytes[8]  &= 0x3f;  /* clear variant        */
        randomBytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(randomBytes);
    }
    

    randomUUID() 方法生成了一个版本 4 的 UUID,这也是生成 UUID 最方便的方法。如果只使用原生 JDK 的话,基本上都用的这种方式。

    示例如下:

    UUID uuid4 = UUID.randomUUID();
    int version4 = uuid4.version();
    System.out.println("UUID:"+ uuid4+" 版本 " + version4);
    

    程序输出结果如下所示:

    UUID:8c943921-d83e-424a-a627-a12d3cb474db 版本 4
    

    除此之外,UUID 类还提供了另外两个静态方法,其一是 nameUUIDFromBytes()

    public static UUID nameUUIDFromBytes(byte[] name) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException nsae) {
            throw new InternalError("MD5 not supported", nsae);
        }
        byte[] md5Bytes = md.digest(name);
        md5Bytes[6]  &= 0x0f;  /* clear version        */
        md5Bytes[6]  |= 0x30;  /* set to version 3     */
        md5Bytes[8]  &= 0x3f;  /* clear variant        */
        md5Bytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(md5Bytes);
    }
    

    nameUUIDFromBytes() 会生成一个版本 3 的 UUID,不过需要传递一个名称的字节数组作为参数。

    示例如下:

    UUID uuid3 = UUID.nameUUIDFromBytes("test".getBytes());
    int version3 = uuid3.version();
    System.out.println("UUID:"+ uuid3+" 版本 " + version3);
    

    程序输出结果如下所示:

    UUID:098f6bcd-4621-3373-8ade-4e832627b4f6 版本 3
    

    其二是 fromString()

    public static UUID fromString(String name) {
        int len = name.length();
        if (len > 36) {
            throw new IllegalArgumentException("UUID string too large");
        }
    
        int dash1 = name.indexOf('-', 0);
        int dash2 = name.indexOf('-', dash1 + 1);
        int dash3 = name.indexOf('-', dash2 + 1);
        int dash4 = name.indexOf('-', dash3 + 1);
        int dash5 = name.indexOf('-', dash4 + 1);
    
        // For any valid input, dash1 through dash4 will be positive and dash5
        // negative, but it's enough to check dash4 and dash5:
        // - if dash1 is -1, dash4 will be -1
        // - if dash1 is positive but dash2 is -1, dash4 will be -1
        // - if dash1 and dash2 is positive, dash3 will be -1, dash4 will be
        //   positive, but so will dash5
        if (dash4 < 0 || dash5 >= 0) {
            throw new IllegalArgumentException("Invalid UUID string: " + name);
        }
    
        long mostSigBits = Long.parseLong(name, 0, dash1, 16) & 0xffffffffL;
        mostSigBits <<= 16;
        mostSigBits |= Long.parseLong(name, dash1 + 1, dash2, 16) & 0xffffL;
        mostSigBits <<= 16;
        mostSigBits |= Long.parseLong(name, dash2 + 1, dash3, 16) & 0xffffL;
        long leastSigBits = Long.parseLong(name, dash3 + 1, dash4, 16) & 0xffffL;
        leastSigBits <<= 48;
        leastSigBits |= Long.parseLong(name, dash4 + 1, len, 16) & 0xffffffffffffL;
    
        return new UUID(mostSigBits, leastSigBits);
    }
    

    fromString() 方法会生成一个基于指定 UUID 字符串的 UUID 对象,如果指定的 UUID 字符串不符合 UUID 的格式,将抛出 IllegalArgumentException 异常。

    示例如下:

    UUID uuid = UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d");
    int version = uuid.version();
    System.out.println("UUID:"+ uuid+" 版本 " + version);
    

    程序输出结果如下所示:

    UUID:38400000-8cf0-11bd-b23e-10b96e4ef00d 版本 1
    

    除了使用 JDK 原生的 API 之外,还可以使用 com.fasterxml.uuid.Generators,需要先在项目中加入该类的 Maven 依赖。

    <dependency>
        <groupId>com.fasterxml.uuid</groupId>
        <artifactId>java-uuid-generator</artifactId>
        <version>3.1.4</version>
    </dependency>
    

    然后我们来看一下如何使用它:

    /**
     * @author 沉默王二,一枚有趣的程序员
     */
    public class UUIDVersionExample {
        public static void main(String[] args) {
            UUID uuid1 = Generators.timeBasedGenerator().generate();
            System.out.println("UUID : "+uuid1);
            System.out.println("UUID 版本 : "+uuid1.version());
    
            UUID uuid2 = Generators.randomBasedGenerator().generate();
            System.out.println("UUID : "+uuid2);
            System.out.println("UUID 版本 : "+uuid2.version());
        }
    }
    

    Generators.timeBasedGenerator().generate() 可用于生成版本 1 的 UUID,Generators.randomBasedGenerator().generate() 可用于生成版本 4 的 UUID。

    来看一下输出结果:

    UUID : ebee82f5-cfd2-11ea-82a7-8536e13d4951
    UUID 版本 : 1
    UUID : d2ccc752-c824-4bbc-8cc7-52c8246bbc6a
    UUID 版本 : 4
    

    好了,我想关于 UUID 的一切,我都已经说明白了。赶紧把这篇文章先发给小王预览一下,让他涨涨见识。


    我是沉默王二,一枚有颜值却靠才华苟且的程序员。关注即可提升学习效率,别忘了三连啊,点赞、收藏、留言,我不挑,奥利给

    注:如果文章有任何问题,欢迎毫不留情地指正。

    如果你觉得文章对你有些帮助欢迎微信搜索「沉默王二」第一时间阅读,本文 GitHub github.com/itwanger 已收录,欢迎 star。

    展开全文
  • 在js,有indexOf 这样的方法,却没有像java一样startsWith 或者 endsWith 这样的方法。研究了半天,在js,通通可以用 indexOf()!=-1 来代替。要记得,这个indexOf()!=-1 和 indexOf()>0 得到结果是不同...
  • 今天浏览了一下java里的String类,发现一个静态方法有点意思,就是我们常用的indexOf(String str)的底层实现,先看下代码调用链。 public int indexOf(String str) { return indexOf(str, 0); } public int index...
  • 在js,有indexOf 这样的方法,却没有像java一样startsWith 或者 endsWith 这样的方法。 研究了半天,在js,通通可以用 indexOf()!=-1 来代替。要记得,这个indexOf()!=-1 和 indexOf()>0 得到结果是不同...
  • java里的subString方法

    2016-10-20 15:57:46
    1.两个例子 "hamburger".substring(4, 8) returns "urge" "smiles".substring(1, 5) returns "mile" 2. String s = "asklj我aslkjdhs们aaksd... String s1 = s.substring(s.indexOf("我") + 1, s.indexOf("们"));
  • 在js,有indexOf 这样的方法,却没有像java一样startsWith 或者 endsWith 这样的方法。研究了半天,在js,通通可以用 indexOf()!=-1 来代替。要记得,这个indexOf()!=-1 和 indexOf()&gt;0 得到结果是...
  • al.remove方法调用时候 if(al.contains(a[i])||al.contains(c[i])) { for(int i1=0;i1<al.size();i1++) { if(al.get(i1).equals(a[i])) { al.remove(i1); al.add(i1,0); } if(al.get(i1).equals(c[i])){ al.re....
  • js有indexOf方法,却没有像java一样startsWith 或者 endsWith 这样方法。 在js,通通可以用 indexOf()!=-1 来代替。indexOf()!=-1 和 indexOf()>0 得到结果是不同。 比如下面例子:(功能:希望...
  • Java中使用indexOf或lastIndexOf方法来获得指定字符在字符串里第一次出现的下标。 1.indexOf public int indexOf(String str, int fromIndex)查找String str在字符串里的第一次出现的下标,从int...
  • 今天在调一个接口时候,sql和实现方法都写好了,单元测试时报这个错误: Parameter index out of range (5 &gt; number of parameters, which is 4). 翻译过来就是sql需要五个参数,但是只传了四个参数。...
  • 业务办理的时候发现正则的匹配效率极其低下,耗时居然要1分钟,而jdk的String的index这个类居然耗时只有100分之一,至于具体的区别如下 具体的代码逻辑如下: 1、正则匹配耗时监控 //10、资讯主表、快讯表当...
  • Java中String常用方法

    2019-11-19 20:16:44
    Java中String类有一些特殊,Java中规定String是一个类,但是它可以像四类八种声明变量一样声明一个对象。...如果想找到一个字符串具体哪个字符或具体字符位置,可以用charAt(int a)、indexof(char s)方法...
  • request.getRequestURI()获取请求页面的相对路径,为一个字符串indexOf:类String里的方法,String str = "abc";int index = str.indexOf("a");a的下标为0,所以index=0.
  • indexOf():返回指定字符索引。 charAt():返回指定索引处字符。 replace():字符串替换。 trim():去除字符串两端空白。 split():分割字符串,返回一个分割后字符串数组。 ...
  • String rssi = mes.substring(mes.indexOf("rssi")+7,mes.indexOf("ibeaconTxPower")-2); int abc = Integer.parseInt(rssi); System.out.println("第一个网关RSSI值: "+Integer.parseInt(rssi)); } @...
  • java方法改变传入参数值 问题描述: 方法外把一个变量作为参数传给一个方法 方法里面改变变量值后 方法值不会变 我用代码 num 是外面传过来参数 also: while (rst.next()) { if (veStrLesson.size() &...
  • Java字符串及其中常用方法

    千次阅读 2021-03-01 22:11:19
    字符串是由多个字符组成一串数据 String特点: 字符串是常量,一旦被创建就不能改变,这是因为字符串值是存放在方法常量池里面,但是引用可以改变。 字符串字面值"ab"也可以看成是一个...public int indexOf
  • List除了从Collection集合继承的方法外,List集合添加了一些根据索引来操作集合元素的方法: 序号 返回值 函数 作用 1 void add(int index,Object ele) 在index位置插入ele元素 2 boolean addAll(int ...
  • ①append方法:字符串拼接 ②subString():截取字符串 ③toString:返回一个String对象 ...⑤indexOf():查找字符 ⑥String.intern()方法:先去常量池找当前字符串引用并返回该字符串在常量池当中引用 ...
  • List接口方法 List除了从Collection集合继承的方法外,List 集合添加了一些根据索引来操作集合元素的方法。 void add(int index, Object ele):在index位置插入...int indexOf(Object obj):返回obj在集合中首次出现
  • •字符串常用属性  string.length()————>返回字符串长度,int类型。 •字符串常用的方法  String.contains(";")——————>..."号来分割String,返回是字符串数组 string.indexOf(";...
  • 我使用URL发了一个get请求,如何才能获取到它返回给我Cookie呢。 URL geturl = new URL(myurl);... 哦,是不是要用HttpClient,谢谢啊,那我那个链接的方法不知道有没有什么方法
  • JAVA类比较重载方法

    2012-09-28 11:40:26
    list有一个indexOf(Object o)的方法。但是这个方法却是要求整个对象完全相同。 但是如果传递整个对象话,参数会特别多,但是只传一个id话,却不能比对成功。 于是,在该实体对象中,重载类比较方法,就可以...
  • java的String类型提供了indexOf方法,我们可以通过它来进行判断一串字符串里面是否有包含另一串字符串,indexOf返回是字符串下标,从0开始,如果没有这个字符串返回就是-1。 看代码: public class ...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 173
精华内容 69
关键字:

java里的indexof方法

java 订阅