问题描述:

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

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

测试样例:

“aeiou”

返回:True

“BarackObama”

返回:False

思路1:

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

代码:

public boolean checkDifferent(String iniString) {
// write code here
if(iniString == null){
return false;
} if(iniString.length() == 0){
return true;
}
StringBuilder sd = new StringBuilder(iniString);
//双for循环
for(int i = 0; i < sd.length(); i++){ for(int j = i+1; j < sd.length(); j++){
if(sd.charAt(i) == sd.charAt(j)){
return false;
}
}
} return true;
}

思路2:

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

代码:

import java.util.*;

public class Different {
public boolean checkDifferent(String iniString) {
// write code here
if(iniString == null || iniString.length() > 3000){
return false;
} if(iniString.length() == 0){
return true;
} // System.out.println(iniString);
char[] arr = iniString.toCharArray();
QuickSort(arr, 0, iniString.length()-1); // StringBuilder sd = new StringBuilder(arr.toString());
for(char ch : arr){
System.out.print(ch);
}
System.out.println();
for(int i = 0; i < arr.length-1; i++){
if(arr[i] == arr[i+1]){
return false;
}
} return true; } public int Partition(char[] arr, int start, int end){
if(arr == null || arr.length == 0 || start < 0 || end < 0){
return -1;
} int index = start + (int)(Math.random() * ((end - start) + 1));//随机选择一个作为标杆的数字 //将标杆放在数组最后一位
// System.out.println(arr.toString());
// System.out.println(arr[index]);
// System.out.println(arr[end]);
char tmp = arr[index]; arr[index] = arr[end]; arr[end] = tmp; int small = start - 1;//small用来存储从右到左第一个小于标杆的数字的下标
for(index = start; index < end; index++){
if(arr[index] < arr[end]){//如果小于标杆
small++;//更新第一个小的
if(small != index){//如果当前遍历的不是第一个小的
tmp = arr[index];arr[index] = arr[small];arr[small] = tmp;//将当前遍历的数字放在第一个小的位置上 }
}
} //由于small指示的是从右到左第一个小于标杆的,而此时标杆还放在数组最后,因此,应该将标杆放在small后面一位。
small++;
tmp = arr[small];arr[small] = arr[end]; arr[end] = tmp; return small;//返回位置为所选择的标杆最后的位置 } public void QuickSort(char[] arr, int start, int end){ if(start == end){
return;
}
int index = Partition(arr, start, end); if(index > start){
QuickSort(arr, start, index - 1);
}
if(index < end){
QuickSort(arr, index + 1, end);
}
}
}

思路3:

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

import java.util.*;

public class Different {
public boolean checkDifferent(String iniString) { if(iniString == null || iniString.length() > 3000){
return false;
} if(iniString.length() == 0){
return true;
} for(int i = 0; i < iniString.length() - 1; i++){
if(iniString.substring(i+1).contains(iniString.subSequence(i, i+1))){
return false;
}
} return true; }
}

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. 安装系统时出现“windows无法安装到这个磁盘。选中的的磁盘采用GPT分区形式”

    安装系统到提示你不能安装在那个磁盘的一步,然后按住shift+F10呼出diskpart命令符,然后依次输入 diskpart list disk select disk 0 clean conver ...

  2. 使用jquery、ajax不刷新页面打印表格(返回数据类型text、json);

    效果图: 一:返回数据是text时 1.表单代码: <body> <form action="#" method="post"> 姓名: ...

  3. 点击每个li节点,都弹出其文本值及修改

    点击每个li节点,都弹出其文本值 1,获取所有的li节点 var liNodes=document.GetElementsByTagName("li"); 2,使用for循环进行遍 ...

  4. @SuppressWarnings("deprecation")

    在Java编译过程中会出现很多警告,有很多是安全的,但是每次编译有很多警告影响我们对error的过滤和修改,我们可以在代码中加上 @SuppressWarnings("XXXX") ...

  5. 十分钟搞定微信企业帐号“echostr校验失败,请您检查是否正确解密并输出明文echostr”

    问题域:在这里我们只解决密文可以正确解密,但微信验证提示“echostr校验失败,请您检查是否正确解密并输出明文echostr”的问题. 干货:没有正确验证的原因是:你给微信返回的是字符串,而微信需要 ...

  6. Combination Sum II

    public class Solution { public List<List<Integer>> combinationSum2(int[] candidates, int ...

  7. Opera浏览器导出收藏到Chrome,和几个Chrome的一些小技巧

    Opera浏览器还是不错的,但是用着不是特别爽,老是感觉怪怪的,也说不上来哪里不好. 还是换回了Chrome浏览器,Chrome浏览器有一个让我念念不忘的地方,就是收藏夹会自动显示,当打开网页之后,又 ...

  8. Pyside开篇杂记

    最近学习刚开始学习pyside,基本了解了一些类的用法,个人感觉就接触而言与pyqt并无本质区别. 双方资料基本可以相互借鉴,个人更倾向与pyside,查阅资料时也经常会在pyqt内得到解决方案. 之 ...

  9. SSHD服务搭建

    SSH协议:安全外壳协议.为Secure Shell 缩写.SSH为建立在应用层和传输层基础上的安全协议.   1.检查SSH服务端安装情况 [root@rhel6_84 ~]# rpm -qpi / ...

  10. System.Data.OleDb操作access数据库类,【bubuko.com】

    access数据库在应用了System.Data.OleDb后操作会很方便,这是一个常用的数据库操作类,其中两个方法,一个是返回datatable的,一个是执行sql语句返回影响记录的(一般是inse ...