问题描述:

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

给定一个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. web服务器软件集成包问题

    今天下了wampserver,运行错误缺少dll,然后下载apprev也是,最后下了个wampserver 32位了终于没问题了.

  2. Linear Algebra lecture9 note

    Linear independence Spanning a space Basis and dimension 以上概念都是针对a bunch of vectors, 不是矩阵里的概念   Supp ...

  3. 【P1915】[usaco09 dec gold]电视游戏问题

    在百度上搜到了nzx学长的题解orz 原题: 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可是后来他发现奶牛们玩游戏之后比原先产更多的奶.很明显,这是因为满足的牛会产更 ...

  4. LINUX测试环境部署mysql(三)

    安装配置mysql 1.安装 查看有没有安装过: yum list installed mysql* rpm -qa | grep mysql* 查看有没有安装包: yum list mysql* 安 ...

  5. unity行为树制作AI简单例子(2)

    继续昨天的工程,给Monster添加一个空物体命名为AI,在AI添加脚本BehaviorTree,然后就可以打开行为树编辑器进行编辑了 先写好自定义的节点脚本,下面是一个寻找漫游点的行为节点脚本 us ...

  6. comboBox 手动输入后回车自动更新数据

    C# Winform ComboBox 在输入内容时 会在下拉菜单中显示 根据输入内容查询的结果 2014-01-02 16:42匿名 | 浏览 713 次 C# ComboBox 在输入内容时 会在 ...

  7. Windows 2012 中文乱码的解决办法

    背景:服务器安装2012 R2英文环境,软件为中文显示.已下载中文语言包安装到服务器上 现象:TXT文档的中文在服务器上打开显示为乱码,复制到本地电脑上可正常显示 解决办法:控制面板-语言-更改日期. ...

  8. C#编程总结(十四)dynamic

    http://www.cnblogs.com/yank/p/4177619.html C#编程总结(十四)dynamic 介绍 Visual C# 2010 引入了一个新类型 dynamic. 该类型 ...

  9. DB SQL Monitor 阻塞及等待事件监控工具

    SQL Monitor Designed By zhaoguan wang 说明------------------------------------------------------------ ...

  10. [转]编译安装libevent,memcache,以及php的memcached扩展

    一 安装libevent 1.去官网http://libevent.org/ 下载最新源码,我用的是libevent-2.0.20-stable.tar.gz 2.解压到/usr/src目录 ,执行命 ...