牛客网程序员面试金典:1.1确定字符互异(java实现)
2016-07-09 11:11
459 查看
问题描述:
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
“aeiou”
返回:True
“BarackObama”
返回:False
思路1:
最直接的做法莫过于用双循环,两两比较字符串,但是时间复杂度O(n^2)
代码:
思路2:
对原始字符串进行排序O(nlogn),然后遍历比较相邻的字符的大小。总的还是O(nlogn).
代码:
思路3:
每次遍历一个字符,检查当前字符是否出现在后续字符串中(和思路1其实是一样的,只不过下面利用了java库函数来实现的)
PS:下面是在牛客网上提交程序,三者的时间消耗与空间消耗
时间:42ms,149ms,35ms
空间:649KB,1868KB,728KB
另外原题目中要求不能使用其他的存储结构,那么只有3是满足条件的。
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个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是满足条件的。
相关文章推荐
- Android面试题1
- 【钜惠预告】黑马程序员暑期抢座活动即将上线
- 剑指Offer:面试题34——丑数(java实现)
- 面试冒泡排序
- 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)
- 【雷军】给程序员的五点建议--如何成为编程高手并以此创业
- Git入门(四)——没有版本控制意识的程序员不是一个好的程序员
- Git入门(三)——没有版本控制意识的程序员不是一个好的程序员
- Java线程面试题 Top 50
- 剑指offer之面试题17 :合并两个排序的链表
- js基础篇string&&array(应YX同学面试复习要求 - -)
- 黑马程序员_Java基础_我的Day11学习笔记
- 各类程序员学习路线图
- JAVA实现链表面试题
- 程序员们的时间管理法则
- 一个平庸程序员自白:我不牛逼但那又怎样?
- 程序员学习能力提升三要素
- 第139课: Spark面试经典系列之数据倾斜解决之对于两个RDD数据量都很大且倾斜的Key特别多如何解决?
- 剑指offer之面试题16 :反转链表
- 程序员与禅的对话录