牛客网程序员面试金典:1.1确定字符互异(java实现)

来源:互联网 发布:淘宝查优惠券插件 编辑:程序博客网 时间:2024/05/20 05:57

问题描述:

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

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网易邮箱取消账户关联没反应怎么办 剑三重置版客户端修复不成功怎么办 网易闪电邮的邮件满了怎么办 忘了手机的账号和密码怎么办 手机绑定的扣扣达到十个上限怎么办 邮箱发送邮件到上限无法发送怎么办 路由器重置后不知道账号密码怎么办 发出的邮件别人看了撤回不了怎么办 域名和邮箱是不同的公司怎么办 qq音乐听过的歌单找不到了怎么办 快手开直播前置摄像头太暗怎么办 小米手机帐号绑定无法侠用怎么办 用交易猫买完游戏账号被骗了怎么办 一个华为账号有两个游戏账号怎么办 加密u盘电脑上打开空怎么办 国网加密u盘电脑打开为空怎么办 足球竞彩软件下架后里面的钱怎么办 竞彩足球提现不到账怎么办 竞彩足球投注后输了怎么办 英雄联盟鼠标箭头右键点不了怎么办 上古卷轴5数值修改错了怎么办 小时候打针把屁股脂肪打扁了怎么办 大繁盛满腹市场2对话时闪退怎么办 月经来了一个月了还不停怎么办 对办公室的异性老师产生好感怎么办 上古卷轴5任务NPC老打我怎么办 1岁半宝宝走路内八字怎么办 最近几个月例假周期都25天怎么办 从pr导出的视频大小不一样怎么办 合作医疗收据丢了不给报销怎么办 沧州新生医院—老人腹胀了该怎么办 内痔疮术后一个月吃了点辣椒怎么办 肛周脓肿手术后大便干怎么办 月经半个月了还没干净怎么办 房东出租违建房不退房租怎么办 上海公租房住满5年后怎么办 监狱对死缓犯人延长转为无期怎么办 手机号码办理的宽带不想要了怎么办 朋友诈骗罪被关看守所了该怎么办 打架被拘留家里有孩子没人看怎么办 刑事拘留满37天给逮捕了怎么办