zoukankan      html  css  js  c++  java
  • 牛客网程序员面试金典:1.1确定字符互异(java实现)

    问题描述:

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

    给定一个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是满足条件的。

  • 相关阅读:
    c++标准库cstring文件
    c++标准库string文件
    c++标准库cmath文件
    micro:bit用蜂鸣器制作计时器
    【Python入门自学笔记专辑】——PythonUnicode字符
    eclips安装教程
    题目(18)答案
    Console.Write格式化输出
    图像传输有用到,图像与数据流相互转换
    datalist、repearter、gridview显示行号的三种方法 或者是获取datalist行id
  • 原文地址:https://www.cnblogs.com/wenbaoli/p/5655697.html
Copyright © 2011-2022 走看看