问题描述:

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

给定一个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. SQL_函数

    五毛叶 — SQL_函数: 如下: 1 SQL_Aggregate函数 AVG() - 返回平均值 COUNT() - 返回行数 FIRST() - 返回第一个记录的值 LAST() - 返回最后一个 ...

  2. php 函数strpos()

    strpos() 函数查找字符串在另一字符串中第一次出现的位置. strpos(string,find,start) 返回  从string中的start位置开始找find第一次出现的位置 注意: s ...

  3. ✡ leetcode 171. Excel Sheet Column Number 字母转换为数字 --------- java

    Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, retur ...

  4. Strategy - 策略模式

    策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.public interface FlyBehavior { public void fly() ...

  5. Search Insert Position

    int searchInsert(int* nums, int numsSize, int target) { ; ); ; int mid; while(low<=high){ mid=(lo ...

  6. Qt中数据模块学习

    QtSql模块 驱动类型和数据库:不同的数据库用不同的驱动连接(接口不同) QDB2->DB2 QOCI->orcle QODBC->SQLServer等 QSqlDataBase类 ...

  7. wordpress钩子和钩子函数

    ccc,看了很多博客,无法理解,还是自己来写吧. wordpress 在wordpress中有很多钩子,还有很多钩子函数,在什么地方用什么钩子,用什么钩子函数, 需要明白两个问题: 1:什么是钩子,钩 ...

  8. Perl/Nagios – Can’t locate utils.pm in @INC

    While trying to use a Nagios plugin I got an error saying that “Can’t locate utils.pm in @INC”. Foll ...

  9. C#中dynamic的正确用法

    C#中dynamic的正确用法  http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4 ...

  10. unity, 调节图片导入尺寸

    unity中直接导入高清图,通过max size来调节图片尺寸. 打包的时候通过看editor log或通过插件来监视是否有过大尺寸的图片.