开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

北美亚特兰大一金融服务公司面试总结

这一金融服务公司的总部不在美国,在荷兰的阿姆斯特丹。 公司的主要业务是为中小金融机构提供技术方面的业务扩展,包括 API 的服务和在这个服务上与其他公司建立的数据通道。 面试结果 非常不幸的是这家公司在第一轮面试完成后就明确的表示不再进行下一轮的面试的。 但公司面试的同仁还是非常客气的给出了对我这个面试人的总结。整体总结情况就是对本人的评价还是非常不错,有热情也比较符合团队需求,其他经验也比较丰富。 重点是我没有 Spring Reactive 编程的经验,有部分的 Authentication 相关的工作经验。 从后面的总结来看 Spring Reactive 是硬伤,因为没有这个 Spring Reactive 的工作经验可能没有办法适应他们的产品需求。 如果是因为这个原因被拒,那么也是情有可原也不冤枉。 随后也就搜索了下有关 Spring Reactive 的知识。 Reactor 框架是 Pivotal 基于 Reactive Programming 思想实现的。它符合 Reactive Streams 规范 (Reactive Streams 是由 Netflix、TypeSafe、Pivotal 等公司发起的) 的一项技术。其名字有 反应堆 之意,反映了其背后的强大的 性能。 Reactive Programming,中文称 反应式编程。Reactive Programming 是一种 非阻塞、事件驱动数据流 的开发方案,使用 函数式编程 的概念来操作数据流,系统中某部分的数据变动后会自动更新其他部分,而且成本极低。 Spring 框架中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器构建的。Reactive 堆栈 Web 框架 Spring WebFlux 在更高版本 5.0 中添加。它是完全非阻塞的,支持Reactive Streams背压,并在 Netty,Undertow 和 Servlet 3.1 容器等服务器上运行。     简单来说,在 Spring 中可能需要更多的了解 WebFlux 框架。 如何拿 Reactive 和传统的 MVC 框架来进行下对比的话,大致的区别如上图所示,可以认为 Reactive 是相对独立于 MVC 的一种框架和调用栈,需要有时间的时候详细了解下。 面试总结 这次面试的整体情况还是良好的。 因为没有 Spring Reactive 的相关知识,因此被拒也在情理之中。这个也不能说明有知识缺陷,可能是在平时工作的项目中没有这方面的需求,因此也没有掌握相关的内容。 唯一需要补充的就是了解相关概念,并且在有空闲的时候进行一些充电即可。 公司面试的过程中没有涉及到算法,在线编程等内容,主要是聊天,聊天的过程还是非常愉快的,整体评价这次面试还是非常轻松和友好的,只是被拒后小郁闷了 3 分钟。 https://www.ossez.com/t/topic/13453

2021年04月30日 0Comments 638Browse 0Like Read more
Computer Science

A “word-wrap” functionality(一个字符串包裹函数)

问题描述 下面是有关这个问题的描述部分。 英文 We are building a word processor and we would like to implement a “word-wrap” functionality. Given a list of words followed by a maximum number of characters in a line, return a collection of strings where each string element represents a line that contains as many words as possible, with the words in each line being concatenated with a single ‘-’ (representing a space, but easier to see for testing). The length of each string must not exceed the maximum character length per line. Your function should take in the maximum characters per line and return a data structure representing all lines in the indicated max length. 中文 我们希望构建一个字符串处理函数,这个字符串处理函数将会对给定输入的字符串和参数进行处理。 我们首先将会定义一个字符串的数组,在这个字符串的数组中每一个元素都是存储为一个单词,同时我们将会给出一个整数类型的参数。你的方法将会对上面输入的 2 个参数进行运算,在每一个单词和每一个单词之间会添加一个字符 ”-“ 来进行区分,同时新生成的数组或者 List 每一元素的字符串长度将不能超过给出的字符串的长度。 如果你新生成的元素是以横杠结尾的话,那么你需要删除这个横杠。 样例 下面给出了这个问题的示例,以便于你参考。 输入参数 1 输入参数 2 输出 words1 = [ “The”, “day”, “began”, “as”, “still”, “as”, “the”, “night”, “abruptly”, “lighted”, “with”, “brilliant”, “flame” ] 13 [ “The-day-began”, “as-still-as”, “the-night”, “abruptly”, “lighted-with”, “brilliant”, “flame” ] words1 = [ “The”, “day”, “began”, “as”, “still”, “as”, “the”, “night”, “abruptly”, “lighted”, “with”, “brilliant”, “flame” ] 20 [ “The-day-began-as”, “still-as-the-night”, “abruptly-lighted”, “with-brilliant-flame” ] words2 = [ “Hello” ] 5 [ “Hello” ] words3 = [ “Hello”, “world” ] 5 [ “Hello”, “world” ] words4 = [“Well”, “Hello”, “world” ] 5 [ “Well”, “Hello”, “world” ] words5 = [“Hello”, “HelloWorld”, “Hello”, “Hello”] 20 [ “Hello-HelloWorld”, “Hello-Hello” ] 上面给出的是是测试用的示例,其中输入参数 words1 到 5 就是定义的变量名而已,不需要过度关注。 思路点评和源代码 这个题目的难度还是比较大的,尤其是在没有开发工具进行编译的时情况下。 这个题目是 indeed.com 的一个在线面试测试题。这个公司的在线面试测试使用的是第三方公司提供的评估工具,主持面试的人可能是对技术并不是非常了解的人,或者是对技术比较了解的人,我们不清楚具体的情况。 但是在面试过程中,他们只注重程序的输出和面试的结果,至于你的思路或者你的想法,主持面试的人可能并不十分关注,同时也不怎么会听你的解释,很多时候你都会是在自言自语。 整体感觉面试互动很少,更多的时候是你在对着屏幕说话。 最开始的时候,我的思路是首先对给出的数组进行遍历,当取得第一个元素的时候,将元素后面添加横杠,然后与长度进行对比,如果长度超过了给定的长度的话那么就删除横杠后压入需要返回的列表中。 如果长度少于返回的长度,那么再取出下一个元素,同时再结尾再添加横杆后进行判断,然后再确定横杠的处理。 这个题目的主要问题就在于横杠的处理,有时候横杠在结尾,有时候横杠在开头,你需要一个一个判读。 在随后的测试中,我发现一直是横杠处理不好,结果导致没有完全通过最后的测试,就是上面测试用例的第二行。 思路 2 因为这个题目时间有限,并且我们还不能使用 StringUtils 来进行一些快速的字符串处理,因此我没有在规定的时间内完成所有的测试。在随后结束面试后,我再仔细思考了下问题后发现其实我们还可以有其他的办法来进行操作。 我使用下面的思路,并且完成了代码的修改。 首先我们需要将输入的数组变成一个长的字符串,单词之间使用横杠分隔。例如,[ “Hello”, “world” ] 将会变成字符串为:Hello-world。 在完成上面的操作后,我们需要使用一个 while 循环来做。 首先在 while 循环中判读整个字符串长度小于给定的长度,这个时候需要直接返回,然后中断循环。 下一步,对字符串,从头到给定的长度进行截断后获得子字符串,随后对子字符串进行判断,如果这个子字符串是以横杠结尾的话,删除横杠然后压入需要返回的数组,然后更新需要处理的字符串为截断后余下的字符串。 如果按照给定的长度进行截断后,你获得最后的一个字符不是横杠,那么我们就知道你截断到了单词上,获得的子字符串中,找到最后一个横杠,然后获得索引的 ID,在获得这个索引的 ID 后对需要处理的字符串按照索引 ID 进行截断。 然后删除掉最后的横杠压入需要返回的列表中。…

2021年04月30日 0Comments 582Browse 0Like Read more
Computer Science

First Unique Character in a String 的变种问题返回第一个找到符合条件的字符

问题描述 下面是有关这个问题的描述部分。 英文 Given a string s, return the first non-repeating character in it and return its index. If it does not exist, return -1. 中文 针对给定的一个字符串 s,你需要写一个算法,返回给定字符串中不重复字符。 这个题目在随后的面试中又出来变种。 这次需要函数返回的找到的字符串,同时输入的字符串中还有大小写。 另外,因为在线编译器的限制,你又不能使用 HashMap。   解题思路 使用 Java 来说还是相对比较好处理的。 解题思路也比较简单,你需要使用一个中间变量来存储,首先还是需要将进行处理的字符串转换为 char 的数组。 然后在数组中拿到第一个字符。 当你拿到第一个字符的时候,你做这样一件事情,将这个字符对目标字符串进行替换为 “”; 如果有相同的,那么肯定会被替换掉,同时你再考虑替换掉一次大写的,一次小写的。 如果有大写字母相同的,那么也会被替换掉。 例如字符串 “serTSSEr”,那么你在完成后上面的算法后,假设我们对比第一个要替换的字符是 s,那么完成后算法后的字符串为 “erTEr”。 我们发现字符串的长度就不是原始长度 -1 了,因为你替换了多个字符串,因此可以知道这个被查找的字符是重复的。 当我们循环到字符 T 的时候,我们会发现完成后算法后的字符串长度就是原始输入字符串长度 -1,那么我们就知道 T 就是我们需要输出的字符了。 需要注意的是特殊情况 “ssee” 这种情况,如果你循环到最后,可能会发现原始字符的长度和完成整个循环后字符的长度没有变化,那么说明所有的字符都有重复,那么你应该返回 “”。 更进一步 为了减少搜索次数,你可以在完成后第一次替换后的余下的字符串中进行算法查找和替换,因为这个算法只需要找到字符,并不需要你输出下标。 因此在循环中,下次需要查找的字符串长度就减少了,算法的效率也就更高了。 完整测试代码,请参考题目中的 GitHub 链接地址:https://github.com/cwiki-us-docs/java-tutorials/blob/master/toolkits/codebank/src/test/java/com/ossez/toolkits/codebank/tests/leetcode/LeetCode0387FirstUniqueCharacterTest.java 我们这里将这个测试方法写在下面供需要的童鞋参考。 /** * Return the first Uniq Char String without using Map * @param data * @return */ private String firstUniqCharString(String data) { // NULL CHECK if (data.equals("")) { return ""; } char[] strArray = data.toCharArray(); String retStr = ""; if (data.length() == 1) { retStr = data; } for (int i = 0; i < strArray.length; i++) { String valStr = Character.toString(strArray[i]); String rData = data; rData = data.replace(valStr, ""); rData = rData.replace(valStr.toUpperCase(Locale.ROOT), ""); rData = rData.replace(valStr.toLowerCase(Locale.ROOT), ""); if (rData.length() == 0) { retStr = ""; } else if (rData.length() + 1 == data.length()) { retStr = valStr; break; } } return retStr; } https://www.ossez.com/t/first-unique-character-in-a-string/13448/2

2021年04月30日 0Comments 514Browse 0Like Read more
Computer Science

北美一工作搜索引擎公司技术岗面经

公司名称就不说了,基本上很多人都会用到的一个在北美地区比较流行找工作时候使用的搜索引擎。 这次面试的岗位是技术岗加部分的管理岗位。就目前来说已经完成第二步了,但是感觉不是非常好,其实主要还是在线写代码这部分。 下面对这次面试的过程和经历进行一些总结。 电话面试 当你投了简历后,公司发现可能会比较符合他们的要求,通常公司都会安排一个招聘人员对你进行电话面试。 电话面试通常比较简单,基本上聊一下你过去做过的项目,你当前的职业情况是什么的,为什么想到为离开现在的公司等等。 这个套路基本上所有的电话面试都会遇到,因此不需要担心,你就把你准备好的说辞重复一遍就好了,当然可以针对公司的一些主要业务的不同来进行调整。 这家公司的电话面试在后半部分可能会问一些基础的 Java 的相关内容,在这次面试中,我被问到了下面的一些问题: Hashmap 和 HashTable 有什么不同 线程安全是什么 重载和重写有什么不同 Big O 是什么 等上面几个问题,通常来说这些问题都比较简单,都是概念性的一些问题,你需要对基础概念有所了解,在这个阶段,一般来说都不太会问到具体算法的问题。有些公司喜欢问时间复杂度和空间复杂的以确保你对算法有所了解。 但是在实际的过程中,绝大部分人都在完成功能需求,真正有机会考虑复杂度的情况不多。但没有办法,面试的人有时候就喜欢搞这些东西。所以建议所有童鞋还是要复习下这方面的内容。 1 小时视频面试 在完成电话面试后,如果他们觉得你还不错,可能就会安排下一步的技术面试的。 通常这部分的面试时最闹心的也是最讨厌的,因为你永远不知道他们会出什么算法题,同时你也不知道他们会不会让你用你自己喜欢的 IDE。 个人感觉在这部分的发挥不是非常好,因此感觉基本上应该是没有第三轮的面试了。应该没有多久就会收到一封非常礼貌的拒绝邮件了。 但不管怎么样,我还是凭记忆写一些遇到的问题供大家参考下。 这 1 小时的技术面试分 2 部分,下面分别描述。 设计分析和概念解释 相对来说这家公司还是比较人性化,他们在面试的时候提出了 5 个分类让你选,这 5 个分类具体不记得了,大致应该是系统性能分析,面向对象,测试,开发流程等。 我选的是系统分析和面向对象。 在系统分析部分,他们给出了服务器上一个内存使用的图片,图片上面 CPU 使用率没有怎么变化,但是内存使用一直在增加。问题是,能通过上面的图片进行一些什么分析。 如果是 Java 的话很有可能就是内存泄漏或者线程问题,这个时候你可以给出一个分析思路,通常就是查看日志,Dump 线程池子,检查 HTTP 访问量等等常规方法,照着忽悠就行了。 面向对象部分的问题就比较多了,但是基本上也就是一些基本的概念,依赖注入是什么,怎么注入的,控制反转又是什么,继承关系,类和抽象类,实现 等等。 基本上都是 Java 面试时候通常使用的概念,如果你对这些内容都不太熟悉或者忘记的话,那么可能就需要好好补一下了。 这些概念在面试的时候经常会被问到。 在完成后上面的问题后就是很多人都非常头疼的在线写代码了。 我问了可以使用自己的 IDE 吗?回答是不可以,因为他们说是保持对其他面试人员的公平,因为有时候使用自己的 IDE,你可以导入很多你自己的类。当听到这里的时候脑袋上的乌鸦就飞过了。 哎,摆着现成 StringUtils 不用非要傻乎乎的从定义 Char 开始用,只能说脑袋有病而且是病得不轻。但是也没有办法,也就硬着头皮上吧。 问的问题我已经发到 A “word-wrap” functionality(一个字符串包裹函数) 上面了。 有关问题的具体解答和点评,请访问上面的链接进行查看吧。 这里只说说当时的感受,因为有时间限制,所以你需要尽快理解题目的意思,我尝试用了 StringUtils ,但是在线编译器不让使用。 这个编译器可以让你使用 List,但是有关 List 的方法提示反应很慢,经常提示不出来。 在现场做题的时候没有怎么想明白,想到的就是先获得字符的数组,然后获得第一个单词,然后添加 -,然后再获得第二个,然后再添加 - ,在这个过程中有可能会超过给定的长度,因此需要重新开始下一行。因为可以使用列表,所以你可以比较容易的 add 到你的 List 里面。 但是这里有很多小问题,比如说在不加 - 的时候,正好长度是给定的长度,所以导致有时候输出的不正确,有时候不应该有 - 的时候确有了 -。 在忙活了 40 分钟后终于没有通过测试。 所以估计这家公司应该是凉凉了。 随后在退出面试后,尝试用 IDE 自己写了下,发现如果可以让我用 StringUtils 函数也不是非常复杂。 我们可以将获得的字符串中间全部先加上 -。 然后按照 - 来进行拆分直到重构的字符串为 NULL,这里你可以使用一个 While 循环来做。 可以使用的方法为 removeEnd 和 substring 等。 具体的解答和分析,请访问上面链接中有关问题的具体分析即可。 面试总结 这次面试应该是失败的,总结下来就是很多人都不是非常舒服的代码部分。     因为找工作之前很多人都会复习下基本概念,面向对象,和一些基本的数据结构,因此上面的概念部分只要不是特别偏,很多人都不感觉非常不舒服。 其实非常不舒服的地方就是在在线写代码部分,因为很多已经工作过的同事在工作的时候基本上不会接触到具体的算法,而且这些算法其实很多也没有太大的意义。 但是实际上算法题目非常多,很多都集中在字符串处理上面,通过这次面试,建议还是同学们需要对常用的字符串处理多进行练习。 包括有获得字符串长度,获得子字符串,如何拆分,如何获得字符串中的某一个值等等,通常这些能够帮助你更有信心去面对下一步的挑战。 其实也没有什么关系了,找工作就是在不断的失败中总结,从工作岗位到开始找工作总是需要有一个热身的部分,大家把每一次失败都当做热身就好了。 希望所有人当你有机会面试别人的时候,得饶人处且饶人吧。   https://www.ossez.com/t/topic/13451

2021年04月29日 0Comments 481Browse 0Like Read more
Computer Science

一房地产数据服务初创公司的面经

北美一有关房地产开发和服务的初创公司面经。 因为新冠疫情的原因,很多面试都已经放到网络上了。在北美进行面试之前,还是建议所有打算从事 IT 的童鞋对基础概念都要熟悉一点点。 如果你是学习 Java 或者面向对象的话,通常使用的一些框架,云平台(主要是 AWS)都需要有一些了解才好。 针对 Java 来说,有关面向对象的概念,包括有什么是依赖注入,什么是反转,什么是组件,继承关系,接口,实现等等,都需要有一些基本的了解。 在面试的时候大部分情况都会问到上面的概念。 在搞清楚上面的概念后,就会有一些实际的算法了,其实这些实际的算法算不上难。正常人突击下基本上都可以掌握,唯一比较麻烦点的地方就是使用各种在线平台手动直接写。 其实这也能够看出来面试公司是否人性化的 hashtable 是如何实现的 这个题目还是有点意思的。 很多人都知道 HashTable, 都知道 HashTable 或者 HashMap 是用来存储 K-V 的。但是至于 HashTable 是如何实现的,可能有很多人不知道。或者就算知道可能也不是非常容易的表述清楚。 这个题目的目的就是要求你设计一个 HashTable。在这个题目中,需要搞清楚几个知识点,K 是怎么存储的,V 又是怎么存储的,其中有一个非常重要的概念就是 K 的哈希(Hash)。 有关什么是 Hash 和 Java 中的哈希函数,请参考文章 Java hashCode() 方法 中的内容。 准确的来说进行 Hash 就是对对象进行或者数据进行散列。当你拿到散列的整形数据后,你将会考虑如何将这一个整形数据存储到一个数组中,这个就是你需要的 Hash 表。通常的算法可能就是去模了。 当然假设你有 10 个数据,但是数组正好也是 10 个,那么最好的算法就是每一个数据存储在一个空间中。 当然实际情况可能就不是这样的了,假设你有 11 个数据,但是存储空间只有 10 个,那么就肯定有 2 个数据存储在同一个位置。这个时候你就可以使用链表来将存储在同一个空间的数据链下去。 如上图显示的就是一个典型的 HashTable 的结构。 对一般的面试来说,掌握这么多的内容基本上能够考察你对基本数据结构的了解,以及对 HashTable 的了解。 如果还需要了解更多的,有关 HashTable 的负载因子,扩容等等的研究的话,其实已经超出了面试本身的范畴了。 正常人如果不是认真复习过,或者没事刷一下的话一般比较难答出来。 相信很多人都是使用 HashTable 或者 HashMap,其实很少去了解里面具体的算法和结构,说心里话也真心没有太大必要去了解。 在这个时候如果面试官揪着这堆东西不放,或者非要你说明白里面的很多配置。那基本上可以说明给你面试的人有病或者是有点孔乙己的意思了。 当然,还是建议在面试的时候复习下 HashTable 和 Hashmap 的关系,如果你真想啃一下的话,不妨去看看源代码。 100 以内素数编程,在线写 题目要求非常简单,就是将 100 以内的素数打印出来就可以了。 这个题目的难度并不大。但是如果你没有遇到过或者没有刷过这个题目的话,可能就会被搞懵逼了。 这个题目有几个关键点,首先 1 是一个特殊的素数,因此你的循环需要从 2 开始。这个很多时候和我们使用的循环从 0 开始有不同。 这个题目能够快速解答的关键就是需要使用定义的函数来做,尽量不要在循环里面嵌套循环,因为这样你会很难跳出这个循环,并且循环的起止判断不好判断。 了解了这 2 个点以后就可以比较容易的解决这个问题了。 有关素数的算法中间和代码,请参考:Prime numbers from 1 to 100 (打印 100 以内的素数) 中的内容。 面试总结 这次面试时今年开始打算换工作以来的第一次面试,因此本身就是当成练手的性质了。 很多工作过比较长时间的人都会知道,在找工作之前,需要进行突击的算法,数据结构,基础概念的巩固。因为在实际工作中,这些东西没有人会用到,也没有人会无聊到去刷这些东西。 但是找工作的时候确不得不进行了解了。 总结这次面试来说就是准备不充分,基本上没有刷题就上去写了,而且有一段时间没有在记事本上写代码了,因此基本上是被他们搞懵逼了。 一上来就弄 HashTable 的算法,这个其实还是有点难度的,如果没有认真复习过一些常用的数据结构的话,肯定是做不出来的。 因为不是非常理想的状态来进行面试的,那么这个结果就可想而知了。 当然这 2 个题目用于巩固下基础还是非常不错的。   https://www.ossez.com/t/topic/13441

2021年04月29日 0Comments 609Browse 0Like Read more
Computer Science

Prime numbers from 1 to 100 (打印 100 以内的素数)

问题描述 下面是有关这个问题的描述部分。 中文 题目要求非常简单,就是将 100 以内的素数打印出来就可以了。 在做题之前,需要了解的就是有关素数的定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。 质数被利用在密码学上,所谓的公钥就是将想要传递的信息在编码时加入质数,编码之后传送给收信人,任何人收到此信息后,若没有此收信人所拥有的密钥,则解密的过程中(实为寻找素数的过程),将会因为找质数的过程(分解质因数)过久,使即使取得信息也会无意义。 在汽车变速箱齿轮的设计上,相邻的两个大小齿轮齿数设计成质数,以增加两齿轮内两个相同的齿相遇啮合次数的最小公倍数,可增强耐用度减少故障。 质素的用途比较高端,说白了就是在计算机科学中可以被用在密码学上面。比如说 Java 中用的 Hash 算法就用到了质素。 因此很多面试题喜欢考察 100 以内的素数。 100以内的质数有 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,在100内共有25个质数。 思路点评和源代码 这个题目的难度并不大。但是如果你没有遇到过或者没有刷过这个题目的话,可能就会被搞懵逼了。 这个题目有几个关键点,首先 1 是一个特殊的素数,因此你的循环需要从 2 开始。这个很多时候和我们使用的循环从 0 开始有不同。 另外这个题目需要 2 个循环来做,因为使用了 2 个循环可能比较容易就把你搞晕了。 为了避免这种情况,建议你使用函数来做。 你可以创建一个函数来判断给定的数字是不是素数。这个函数也非常简单,对于给定的值,从数字 2 开始遍历。假设现在这个函数的输入是 5,那么你的循环要从 2 开始,然后将 5 %2, 这个是取余的运算符。 很显然 5%2 =1, 5%3=2, 5%4 =1。在这个遍历过程中,如果你能发现有数字能够被除尽,那么这个被除数就不是素数,如果你发现遍历完成了也不能被除尽,那么这个数就是素数。 这个函数只返回 T/F 就可以了。     这个题目能够快速解答的关键就是需要使用定义的函数来做,尽量不要在循环里面嵌套循环,因为这样你会很难跳出这个循环,并且循环的起止判断不好判断。 另外还有一点需要注意的是,有些在线测试平台可能不会让你使用 List,这个时候你需要考虑使用数组或者直接输出。 代码 https://github.com/cwiki-us-docs/java-tutorials/blob/master/toolkits/codebank/src/test/java/com/ossez/toolkits/codebank/tests/algorithm/PrimeNumbersTest.java https://www.ossez.com/t/prime-numbers-from-1-to-100-100/13450  

2021年04月29日 0Comments 710Browse 0Like Read more
Computer Science

First Unique Character in a String (找到一个字符串中第一个不重复的字符)

问题描述 下面是有关这个问题的描述部分。 英文 Given a string s, return the first non-repeating character in it and return its index. If it does not exist, return -1. 中文 针对给定的一个字符串 s,你需要写一个算法,返回给定字符串中不重复字符的位置(index),如果所有的字符在给定的字符串中都有重复的话,那么你应该返回 -1。 样例 下面给出了这个问题的示例,以便于你参考。 Input: s = “comossez” 0 Input: s = “lovelycomossez” 2 Input: s = “aabb” -1 思路点评和源代码 整体来说这个题目的难度并不大。 有很多种解题的思路,首先你需要把字符串拆开放到数组中,这样你才能够一个字符一个字符的进行遍历。 我的这个思路肯定不是效率最高的,我的思路就是将字符串放到数组中,然后对数组进行遍历,在这个过程的同时还定义一个 Map,在这个 Map 中存储的 Key 就是正在查找的字符串,如果当前字符串在 Map 中没有的话,就 Put 进去。 Put 进行的 Key 是当前的字符串,值是当前字符串所在数组的下标。 如果当前字符串已经在 Map 中有的了话,我们可以修改 Map 的值为 2#5 这样的方式,中间可以使用 # 号或者任意特殊字符。 当完成上面的遍历后,我们就获得了需要的 map 了。 然后再对 Map 进行遍历,找到第一个不含有 # 号的值就行了。 为了进行有序存储,我们需要使用 LinkedHashMap,因为 HashMap 是无序的,无序的 Map 会把找到第一个的输入顺序弄错。     上图是对内存进行分析后,可以看到初始化后的 Map 的值。 代码 请访问 GitHub:https://github.com/cwiki-us-docs/java-tutorials/blob/master/toolkits/codebank/src/test/java/com/ossez/toolkits/codebank/tests/leetcode/LeetCode0387FirstUniqueCharacterTest.java   https://www.ossez.com/t/java-hashcode/13447

2021年04月27日 0Comments 546Browse 0Like Read more
Computer Science

Java hashCode() 方法

在 java.lang.Object 类中有几个个非常重要的方法,我们今天来讨论下 hashCode() 这个方法。 什么是 Hash Hash 中文叫做哈希也可以叫做散列,使用 Hash 的算法生成字符串或者数字的方法就可以称为 Hash 算法,或者散列算法。 如果还不太明白的话,考虑下 MD5。MD5 就是典型的哈希算法,通过 MD5 算法,不管你是输入字符串,图片,二进制文件,都能获得一个字符串。 获得这个字符串的算法就是 Hash 算法。 为什么要 Hash 我们在这里不打算讨论复杂的 Hash 算法或者 Hash 算法怎么去计算的。因为这样的话,你可能需要很长的时间才能搞明白到底怎么算出来的。 使用 Hash 算法的目的就是为了将获得的数据摘要信息尽量分散,并且尽量的不重复,同时还需要保证相同数据的 Hash 结果是相同不能变化的。 不管你将相同数据 Hash 多少遍,只要数据相同,那么 Hash 必须是相同的。 哈希碰撞 在现实生活中,不同数据的 Hash 结果可能是相同的。 考察下面的代码: logger.debug("HashCode AaAaAa - {}", "AaAaAa".hashCode()); logger.debug("HashCode BBAaBB - {}", "BBAaBB".hashCode()); 上面代码输出的结果是相同的,这种情况就是哈希碰撞( Hash collision)。     很遗憾,这种哈希碰撞在现实中是不能避免的。     常用的哈希算法 常用的 Hash 算法有下面的一些算法。 MD5 的算法已经不是安全的 Hash 算法了,在密码学和开发中,已经逐步推荐使用 SHA-256 算法了。 算法 输出长度(位) 输出长度(字节) MD5 128 bits 16 bytes SHA-1 160 bits 20 bytes RipeMD-160 160 bits 20 bytes SHA-256 256 bits 32 bytes SHA-512 512 bits 64 bytes 根据碰撞概率,哈希算法的输出长度越长,就越难产生碰撞,也就越安全。 Java 的 hashCode() Java 中的 hashCode() 方法返回的数据类型是 int 类型。 下面以 String 对象的 hashCode 为例,官方解释中有关 String 对象 Hash 算法计算方式是: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 针对输入字符串是不是 UTF16,将会有不同的计算方法。     IntelliJ IDEA 重写 Hash 算法 如果你不想使用 Java Object 对象中的 Hash 算法,你可以在你的对象中重写 Hash 算法。 在 IntelliJ IDEA 输入快捷键 Alt+Insert,这个将会弹出快速生成方法的选择项。 随后将会提示你选用何种方法来创建 hashCode() 方法。你可以选择使用 JDK 自带的,你也可以选择使用 Apache Commons-lang 的方法来重写方法。当然,你也可以使用其他的一些方法来写,不管哪个方法来写,原理都是相通的。 选择变量,在完成上面的方法选择后,将会提示你选择变量。 将需要创建的变量选择,然后下一步。 同时还需要你选择非空的字段,你可以默认选择也可以不选择。 如下,你可以看到使用 JDK 生成的默认的 hashCode 方法。 @Override public int hashCode() { return Objects.hash(title, topic_id, raw, category, target_recipients, archetype, created_at); }     如果你根据使用的是 Apache 的 Commons 生成的话,结果有所不同。 可以在 IDE 中自行研究下。 需要注意的是,在 hashCode 中,你可能会看到数字 17,31,37。 其实这些数字就是素数了,在 Java 面试的时候可能会有一道题目就是找出 100 以内的素数。 因为 Hash 算法在很多时候其实也可以用于密码学中,密码学的很多基础研究就是对素数的研究。 网络中广泛使用的RSA算法,就是基于素数性质的重要应用。 因此在 hashCode 的方法中,你能看到上面的数字,这个就是有关素数算法的实际应用之一。因为涉及到很多密码学的知识,我们这里就不实际展开了。 通过上面的说明,我们就能够在 Java 中对对象或者数据进行 Hash。 哈希算法和应用是 Java Hashmap 的基础,因此 hashCode 方法在 Java 中也会作为基础方法存在。 https://www.ossez.com/t/java-hashcode/13447  

2021年04月27日 0Comments 612Browse 0Like Read more
Computer Science

Java 类和对象

上 Java 语言的第一课,相信很多老师都会解释一句话就是 Java 是一个纯面向对象的语言。 然后再加上一堆 Java 的历史,再加上一个经典的动物的例子。 比如说,我们要描述动物,不同品种的狗的例子,我们在这个基础上抽象出来一个 Class,这个就是我们说的类了。 为什么叫 Class 这个很多人可能都没有想过吧,其实 Class 这个单词在英语里面有分类的意思。在英语世界里面,会用 Class 来表示很多东西。 比如说 Class A Felony,这个在英语法典里面就是表示的是刑事重罪的 A 分类。 在计算机语言中,我们就使用了 Class 来表示一个类了。 Class 和 Object 对象在我们定义 Class 后,我们就可以得到了。 还是用这个经典狗的例子,我们在定义了狗这一类动物后,我们需要将这个定义的动物映射到一条具体的狗上面。这条狗可能你的,也可能是隔壁老王的。 在现实中,肯定是不可能有 2 条一模一样重复的狗,但是在计算机数据上是可以存在的。 将类映射到具体的对象上的过程就是叫做实例化。这个应该比较好理解吧,因为 Class 是抽象,现在我们不讨论抽象的狗了,我们讨论隔壁老王家的狗。 如果把 Class 的狗直接拿过来用是肯定不行的,因为我们不知道我们现在要讨论的狗是谁的狗。 因此我们需要使用关键字 new 一下我们定义的 Class 的这个对象。然后我们就知道我们需要讨论隔壁老王家的狗了。     这个过程就叫做类的实例化。 因此,总结来说,对象就是实例化后的类。 创建对象 对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建一个对象需要以下三步: 声明:声明一个对象,包括有对象类型和对象的名称 实例化:使用关键字 new 来创建一个对象。 初始化:使用 new 创建对象时,会调用构造方法初始化对象。 实际上我们可能并不是完全按照上面的 3 步来写代码。 实际上,你可以写出下面的代码是没有问题,也是可以编译通过的,你的 IDE 工具可能会提示你说下面的代码是重复的,你可以使用其他方法来避免重复。 String testStr = new String("COM.OSSEZ"); 但是实际上,没有人这样写,绝大部分你看到的代码都是: String testStr = "COM.OSSEZ"; 这是因为 String 这个类在 JDK 中比较特殊,是字符串的对象,通常也是我们用得最多的有关的字符串的操作,因此 String 的对象是可以直接赋值的。 当你直接赋值后,其实 JDK 已经为你完成了上面的 3 步操作了。 有时候,你在定义好对象后,可能还暂时不知道要干什么,你可能就非常粗暴的直接 = null 到给定的对象上面了。 或者就先定义好,在使用的时候再初始化。 例如,你可以使用下面的代码来定义一个对象,但是不对这个对象进行任何操作。但是,随后你就马上要对这个对象进行操作了。 通常你的 IDE 工具会在这里提示要求你初始化这个变量。 这个时候你可以直接 new 一个 String,在你 new 一个 String 的时候,Java 就已经帮你完成了上面说的实例化了。 String testStr; logger.debug("String Size - [{}]", ossezVariable.length()); 上面的代码,在 IDE 中会提示错误的,在构建的时候也会提示定义的变量没有初始化错误。 当然,你也可以直接将 null 赋值给你的变量,这样的结果得到的就是空对象异常。 String testStr = null; logger.debug("String Size - [{}]", ossezVariable.length()); 空对象 在 Java 中,我们可以先定义一个对象,然后将 null 赋值给定义的对象。 考察下面的代码: String testStr = null; logger.debug("String Size - [{}]", testStr.length()); 在上面的代码中,我们将 null 赋值给了一个字符串对象 testStr ,但是我们并没有对这个对象进行任何后续的赋值。     因此这个对象是 null 的,如果这个时候你有代码尝试获得字符串的长度,但是字符串为 null,第二条语句肯定会出现空对象异常。 这在 Java 中非常常见。 https://www.ossez.com/t/java/13446/1

2021年04月26日 0Comments 582Browse 0Like Read more
Computer Science

Java 一维数组的定义和初始化

数组是我们非常常见的一种数据结构。 在 Java 中也不意外,通常我们会对数组进行一些操作,包括插入,删除,查找等。其实在实际的运用过程中,我们可能会用到 Java 提供的集合类型。 这些类型比数组操作更加简便,通常用的是 List,Map,Set 等。 在很多公司面试的时候,为了考察面试人的基本程序功底,并且也为了避免面试的面试人使用很多 Java 的高级特性,而特定规定使用数组。 正是因为有上面的一些规定,导致本人对面试中做题和刷题的反感。 不管怎么样,现实就是这么残酷,为了找一份工作,你可能还是需要对 Java 的数组有一些基本的了解。 定义 Java 语言中提供的数组是用来存储固定大小的同类型元素。 这里有一个重点就是 Java 的数组的长度是固定的,在定义好数组后,数组的长度就不能改变了。 可以有下面 2 种方法来定义数组变量。 int[] intArraySize = new int[10]; Integer intArrayW[] = new Integer[10]; 因为数组是固定长度的,因此你在定义完成 Java 的数组后,你需要对数组长度进行初始化。 在这里我们使用的是为数组设定长度的方法进行初始化的。 在上面的语句中,有 2 中定义数组的方法,一种是类型后面加 [],这种方法是上面的第一句话。 另外一种方法就是在变量后面加 [] 来定义数组。 我们推荐使用第一种方法来进行定义,这种方法更加简单明确。 初始化 数组定义完成后可以有 2 种方法进行初始化。 如果你只定义了数组的长度的话,你就需要在这个时候直接将值插入数组了,如果你没有插入的话,这个数组只等于在内存中划分了存储空间罢了。 使用长度初始化 例如代码: int[] intArraySize = new int[3]; 进行数组初始化。 通过查看内存,我们可以看到内存中初始化的数组,已经划分存储空间了,但是值都是 0。 Integer intArrayW[] = new Integer[3]; 代码中,我们使用 int 的包装类来进行定义的,就是 int 的对象。 我们通过 debug 可以看到,数组空间也已经初始化了,但是看到 intArrayW 其实是一个对象,这个对象是中的所有元素 null 的。如果这个时候你直接访问,那么将会得到空对象异常。 使用数据初始化 另外一种初始化数组的方法就是使用数据来进行初始化了。 你可以通过下面的语句对数组直接赋值。 int[] intArrayValue = {1,2,3}; 然后你再查看内存,你可以看到你已经定义了一个长度为 3 的数组,这个数组中的值分别为 1,2,3。 在面试的时候做题,通常可能会考虑使用这种初始化的方式。尤其是在字符串的处理上。 因为只有这样初始化你才能够在下一步的代码中获得数据,否则你将需要使用另外的步骤来进行数据插入。 考察下面的代码: String[] strArray = {"COM","OSSEZ","US"}; 上面的代码,我们就已经初始化了一个字符串的数组,通过上面的初始化为下一步的程序调用做好准备。 因为在面试的时候,很多面试题都需要先定义数据。 上面的几个步骤能够帮助你迅速完成数据定义的过程。 当然,如果只需要定义字符串,你也可以直接定义。 https://www.ossez.com/t/java/13445

2021年04月26日 0Comments 619Browse 0Like Read more
123
Archives
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,289)
    • Confluence (663)
    • Gradle (12)
  • U.S. (347)
  • 文化旅游 (142)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1