字符字符串字符串笔试面试题
文章结束给大家来个程序员笑话:[M]
1 字符数据在内存中的存储形式
将一个字符常量放到一个字符变量中,实际是将该字符的相应的ASCII代码放到存储单元中。如‘a’的ASCII代码为十进制数97,c1='a',在内存中是以97的二进制01100001存储的。
字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似。这样使字符型数据和整型数据之间可以通用。
字符数据只占一个字节,它只能寄存0~255范围内的整数。
A-X的ASCII值范围65-90 (26个字符 65+26-1)
a-x 的ASCII值范围97-122
//C Language //大小写字母转换:每个小写字母比它相应的大写字母的ASCII码大32 void transfer(){ char c; c='a'; c=c-32; printf("%c",c); //A printf("%d",c); //65 }//end transfer()
//字符转换为ASCII码 char a=(int)'a'; //ASCII码转换为字符串 int c=97; char a=(char)c);
2 设计算法判断一个字符串中字符都是唯一的。
算法1:检查每个字符在字符串中的涌现次数,时间复杂度为O(n^2),但是空间复杂度为O(2)。
public static boolean isUniqueChar(String str){ //输入控制 if(str==null ||str=="") //空字符串长度为0 return true; //只有一个字符 int length=str.length(); if(length==1) return true; //多于2个字符 char a,b; for(int i=0;i<=length-2;i++){ a=str.charAt(i); for(int j=i+1;j<=length-1;j++){ //compare b=str.charAt(j); if(a==b) return false; }//end for }//end for return true; }//end isUnitqueChar()
//测试用例 public static void testCase() { //测试 //字符串为null System.out.println("字符串为null:"+isUniqueChar(null)); //字符串长度为0,空字符串 System.out.println("空字符串:"+isUniqueChar("")); //字符串长度为1 System.out.println("字符串长度为1:"+isUniqueChar("a")); //字符串中无重复字符 System.out.println("字符串中无重复字符:"+isUniqueChar("abc")); //字符串中有重复字符 System.out.println("字符串中有重复字符:"+isUniqueChar("abbc")); }
算法2:如果字符串中的内容可以损坏的话。我们可以将字符串中的字符排序(时间复杂度为O(nlogn)),然后遍历字符串中的某个字符相邻的字符是不是相同(时间复杂度O(n))。但是要注意有些排序算法是需要额外的存储空间的。总的时间复杂度是O(n).
算法3:用hashmap统计每个字符涌现的次数,然后遍历hashmap看是不是有涌现次数过剩一次的字符。这类算法需要用到额外的数据结构hash表。
算法4:先假设字符串中的字符均为ASCII码(如果不是的可以增大存储空间,而算法的逻辑是相同的),那么每个字符用ASCII码表现为整数,即可用0-255的一个数组表现,如果某个字符在数组对应位置涌现次数超过一成则表现该字符串中有重复字符涌现。
时间复杂度O(n),空间复杂度O(n),n为字符串的长度
//有重复字符涌现,返回false public static boolean isUniqueChar(String str){ //输入控制 if(str==null) return true; boolean[] char_set=new boolean[256]; for(int i=0;i<str.length-1;i++){ int val=str.charAt(i); if(char_set[val]) return false; //如果有重复字符涌现,则在数组对应位置上会提早将值设置为ture char_set[val]=true; }//end for return true; }//end isUniqueChar()
3 设计一个算法移除字符串中的重复涌现的字符。并对你的算法设计测试用例。
测试用例
//test cases //字符串为null //字符串为空"" //字符串没有重复字符abcd //全重复字符aaaa //连续重复字符aaaabbbcd //非连续重复字符abcadbc
1)如果某个字符重复复涌现,则删除该字符,如google变为le(删除字符g和o)
算法1:用一个空的数组保存结果字符串,你将原字符串一个个的字符扫描,看每个字符是不是在结果字符串中,如果不在就加在结果字符串中,否则就跳过,扫描下一个字符。时间复杂度O(n*n),空间复杂度O(n)
public static String removeDuplicates(String str) { // 输入控制 if (str == null || str == "") return str; char[] c = removeDuplicates(str.toCharArray()); String strResult = new String(c); return strResult; }// end removeDuplicates() private static char[] removeDuplicates(char[] c) { int length = c.length; char[] result = new char[length]; // 临时存储空间 int resultIndex = 0; // reuslt数组的指针 result[resultIndex]=c[0]; //c中字符a与result中比拟,如果a在result中,跳过,否则参加reuslt中 for(int i=0;i<length;i++){ //c 中字符 char a=c[i]; int j; for(j=0;j<=resultIndex;j++){ //reuslt中字符 char b=result[j]; if(a==b) break; }//end for //条件符合的参加result if(j>resultIndex) result[++resultIndex]=a; }//end for return result; }// end removeDuplicates()
算法2:不需要额外存储空间,在原数组中处置,原数组也同时是结果数组,如果不在就加在结果字符串中,否则就跳过,扫描下一个字符。时间复杂度O(n*n),空间复杂度为0
private static char[] removeDuplicates2(char[] c) { int length = c.length; int resultIndex=0; //c中字符a与result中比拟,如果a在result中,跳过,否则参加reuslt中 for(int i=1;i<length;i++){ //c 中字符 char a=c[i]; int j; for(j=0;j<=resultIndex;j++){ //result中字符 char b=c[j]; if(a==b) break; }//end for //条件符合的参加result if(j>resultIndex) c[++resultIndex]=a; }//end for //残余字符处置 if(resultIndex<length-1){ for(int i=resultIndex+1;i<length;i++) c[i]='0'; } return c; }// end removeDuplicates()
文章结束给大家分享下程序员的一些笑话语录: 关于编程语言
如果 C++是一把锤子的话,那么编程就会变成大手指头。
如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。
---------------------------------
原创文章 By
字符和字符串
---------------------------------