问题描述:

请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。

测试样例:

“aeiou”

返回:True

“BarackObama”

返回:False

思路1:

最直接的做法莫过于用双循环,两两比较字符串,但是时间复杂度O(n^2)

代码:

  1. public boolean checkDifferent(String iniString) {
  2. // write code here
  3. if(iniString == null){
  4. return false;
  5. }
  6. if(iniString.length() == 0){
  7. return true;
  8. }
  9. StringBuilder sd = new StringBuilder(iniString);
  10. //双for循环
  11. for(int i = 0; i < sd.length(); i++){
  12. for(int j = i+1; j < sd.length(); j++){
  13. if(sd.charAt(i) == sd.charAt(j)){
  14. return false;
  15. }
  16. }
  17. }
  18. return true;
  19. }

思路2:

对原始字符串进行排序O(nlogn),然后遍历比较相邻的字符的大小。总的还是O(nlogn).

代码:

  1. import java.util.*;
  2. public class Different {
  3. public boolean checkDifferent(String iniString) {
  4. // write code here
  5. if(iniString == null || iniString.length() > 3000){
  6. return false;
  7. }
  8. if(iniString.length() == 0){
  9. return true;
  10. }
  11. // System.out.println(iniString);
  12. char[] arr = iniString.toCharArray();
  13. QuickSort(arr, 0, iniString.length()-1);
  14. // StringBuilder sd = new StringBuilder(arr.toString());
  15. for(char ch : arr){
  16. System.out.print(ch);
  17. }
  18. System.out.println();
  19. for(int i = 0; i < arr.length-1; i++){
  20. if(arr[i] == arr[i+1]){
  21. return false;
  22. }
  23. }
  24. return true;
  25. }
  26. public int Partition(char[] arr, int start, int end){
  27. if(arr == null || arr.length == 0 || start < 0 || end < 0){
  28. return -1;
  29. }
  30. int index = start + (int)(Math.random() * ((end - start) + 1));//随机选择一个作为标杆的数字
  31. //将标杆放在数组最后一位
  32. // System.out.println(arr.toString());
  33. // System.out.println(arr[index]);
  34. // System.out.println(arr[end]);
  35. char tmp = arr[index]; arr[index] = arr[end]; arr[end] = tmp;
  36. int small = start - 1;//small用来存储从右到左第一个小于标杆的数字的下标
  37. for(index = start; index < end; index++){
  38. if(arr[index] < arr[end]){//如果小于标杆
  39. small++;//更新第一个小的
  40. if(small != index){//如果当前遍历的不是第一个小的
  41. tmp = arr[index];arr[index] = arr[small];arr[small] = tmp;//将当前遍历的数字放在第一个小的位置上
  42. }
  43. }
  44. }
  45. //由于small指示的是从右到左第一个小于标杆的,而此时标杆还放在数组最后,因此,应该将标杆放在small后面一位。
  46. small++;
  47. tmp = arr[small];arr[small] = arr[end]; arr[end] = tmp;
  48. return small;//返回位置为所选择的标杆最后的位置
  49. }
  50. public void QuickSort(char[] arr, int start, int end){
  51. if(start == end){
  52. return;
  53. }
  54. int index = Partition(arr, start, end);
  55. if(index > start){
  56. QuickSort(arr, start, index - 1);
  57. }
  58. if(index < end){
  59. QuickSort(arr, index + 1, end);
  60. }
  61. }
  62. }

思路3:

每次遍历一个字符,检查当前字符是否出现在后续字符串中(和思路1其实是一样的,只不过下面利用了java库函数来实现的)

  1. import java.util.*;
  2. public class Different {
  3. public boolean checkDifferent(String iniString) {
  4. if(iniString == null || iniString.length() > 3000){
  5. return false;
  6. }
  7. if(iniString.length() == 0){
  8. return true;
  9. }
  10. for(int i = 0; i < iniString.length() - 1; i++){
  11. if(iniString.substring(i+1).contains(iniString.subSequence(i, i+1))){
  12. return false;
  13. }
  14. }
  15. return true;
  16. }
  17. }

PS:下面是在牛客网上提交程序,三者的时间消耗与空间消耗

时间:42ms,149ms,35ms

空间:649KB,1868KB,728KB

另外原题目中要求不能使用其他的存储结构,那么只有3是满足条件的。

牛客网程序员面试金典:1.1确定字符互异(java实现)的更多相关文章

  1. 牛客网程序员面试金典:1.2——原串翻转(java实现)

    问题描述: 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量). 给定一个string iniString,请返回一个string,为翻转后的字符串. ...

  2. 像素反转 牛客网 程序员面试金典 C++ Python

    像素反转 牛客网 程序员面试金典 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度. 给定 ...

  3. 二进制插入 牛客网 程序员面试金典 C++ Python java

    二进制插入 牛客网 程序员面试金典 题目描述 有两个32位整数n和m,请编写算法将m的二进制数位插入到n的二进制的第j到第i位,其中二进制的位数从低位数到高位且以0开始. 给定两个数int n和int ...

  4. 二进制小数 牛客网 程序员面试金典 C++ Python

    二进制小数 牛客网 程序员面试金典 题目描述 有一个介于0和1之间的实数,类型为double,返回它的二进制表示.如果该数字无法精确地用32位以内的二进制表示,返回"Error". ...

  5. 二叉树中和为某一值的路径 牛客网 程序员面试金典 C++ Python

    二叉树中和为某一值的路径 牛客网 程序员面试金典 题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一 ...

  6. 平分的直线 牛客网 程序员面试金典 C++ Python

    平分的直线 牛客网 程序员面试金典 C++ Python 题目描述 在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分.假定正方形的上下两条边与x轴平行. 给定两个vecotrA和B ...

  7. 寻找下一个结点 牛客网 程序员面试金典 C++ java Python

    寻找下一个结点 牛客网 程序员面试金典 C++ java Python 题目描述 请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继). 给定树的根结点指针TreeNode* root ...

  8. 奇偶位交换 牛客网 程序员面试金典 C++ Python

    奇偶位交换 牛客网 程序员面试金典 C++ Python 题目描述 请编写程序交换一个数的二进制的奇数位和偶数位.(使用越少的指令越好) 给定一个int x,请返回交换后的数int. 测试样例: 10 ...

  9. 字符串压缩 牛客网 程序员面试金典 C++ Python

    字符串压缩 牛客网 程序员面试金典 C++ Python 题目描述 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能.比如,字符串"aabcccccaaa"经压缩会变 ...

  10. 回文链表 牛客网 程序员面试金典 C++ Python

    回文链表 牛客网 程序员面试金典  C++ Python 题目描述 请编写一个函数,检查链表是否为回文. 给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文. 测试样例 ...

随机推荐

  1. js判断类型方法

    在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null,Boolean, Number和String:复杂数据类型是Object,Object中 ...

  2. Binary Tree Inorder Traversal

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  3. Python通用序列操作

    1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...

  4. kernel/ptrace.c

    /* ptrace.c *//* By Ross Biro 1/23/92 *//* edited by Linus Torvalds */ #include <linux/head.h> ...

  5. Install Debian note

    environment: already install xp,win7 and win8PE, left 87G space to install Debian, this space not fo ...

  6. JS~~~ 前端开发一些常用技巧 模块化结构 &&&&& 命名空间处理 奇技淫巧!!!!!!

    前端开发一些常用技巧               模块化结构       &&&&&     命名空间处理 奇技淫巧!!!!!!2016-09-29    17 ...

  7. linux软raid练习

    创建一个空间大小为10G的raid5,要求其chunk为1024k,格式为ext4文件系统,开机可自动挂载至/backup目录,并支持acl功能: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  8. 学韩顺平老师linux教程--笔记

    第二讲:1.startx  进入图形界面2.shutdown -h now 立刻进行关机3.shutdown -r now 现在重新启动计算机4.reboot          现在重新启动计算机5. ...

  9. NFS文件系统制作

    内核:              linux-3.0 u-boot:          2010.09 开发板:         fl2440(s3c2440主芯片) 交叉编译器:   2011.11 ...

  10. 【原创】关于不同分支代码的Merge有了透彻的理解

    多分支开发,Merge是一个绕不过的话题,不管是Git还是SVN,公司用的是SVN,之前对于SVN的Merge没有很好的研究,出了些状况,这个问题不解决,顺畅地进行多分支开发就是海市蜃楼,下定决心把这 ...