博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题目——《CC150》数组与字符串
阅读量:6516 次
发布时间:2019-06-24

本文共 5642 字,大约阅读时间需要 18 分钟。

 

面试题1.1:实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理?

  注意:ASCII字符共有255个,其中0-127的字符有字符表

 

 

  第一种解法:是《CC150》里面的解法

public static boolean checkDifferent(String iniString) {		if(iniString == null || iniString.length() <= 0)			return true;				String newString = iniString.trim();	//去掉左右空格		int len = newString.length();		if(len > 256)			return false;		boolean[] char_set = new boolean[65536];	//256的牛客网会报数组越界		for(int i=0;i

 

  第二种解法:先排序,然后通过异或运算判断是否有重复的字符

public static boolean checkDifferent(String iniString) {		if(iniString == null || iniString.length() <= 0)			return true;				String newString = iniString.trim();	//去掉左右空格		int len = newString.length();		if(len > 256)			return false;		char[] sortedArr = newString.toCharArray();		Arrays.sort(sortedArr);		for(int i=1;i

 

面试题1.2:实现void reverse(char* str)函数,即反转一个null结尾的字符串

   注意:不分配额外空间,直接就地反转字符串,注意nul字符

import java.util.*; public class Reverse {    public String reverseString(String iniString) {        // write code here        StringBuffer Buf = new StringBuffer();        if(iniString == null || iniString.length() <=0)            return Buf.toString();        int length = iniString.length();        for(int i=length-1;i>=0;i--){            Buf.append(iniString.charAt(i));        }        return Buf.toString();    }}

 

面试题1.3:给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串——《Leetcode》242. 

   思路:变位词问题(anagram),注意是否区分大小写,是否考虑空白字符,如果两个字符串的长度不一样,那么就不可能变位词

  解法1:对两个字符串的字符重新排序后,再组成字符串,然后equals两个字符串是否相等

package cc150;import java.util.Arrays;public class Anagram {	public static void main(String[] args) {		// TODO 自动生成的方法存根		String str1 = "CBA";		String str2 = "ABC";		System.out.println(anagram(str1, str2));	}		public static String sort(String s){		char[] content = s.toCharArray();		Arrays.sort(content);		return new String(content);	//使用new String,toString是StringBuffer用的	}	public static boolean anagram(String s1,String s2){		if(s1.length() != s2.length())			return false;		return sort(s1).equals(sort(s2));	}	}

 

  解法2:建一个256大小的字符数组,然后在这个数组记录每个字母出现的次数,最后比较两个数组是否相等(比第一种慢,且占用空间多)(Leetcode用的类似这种)

package cc150;import java.util.Arrays;public class Anagram {	public static void main(String[] args) {		// TODO 自动生成的方法存根		String str1 = "CBA";		String str2 = "ABC";		System.out.println(anagram(str1, str2));	}		public static boolean anagram(String s1,String s2){		if(s1.length() != s2.length())			return false;				int[] Arr = new int[256];		char[] Arr1 = s1.toCharArray();		for(char c:Arr1){			Arr[c]++;		}				for(int i=0;i

 

面试题1.4:编写一个方法,讲字符串中的空格全部替换为“%20”。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)——《剑指Offer》P61

package cc150;public class ReplaceSpaces {	public static void main(String[] args) {		// TODO 自动生成的方法存根				String str = "AB  C";		System.out.println(replaceSpace(str,5));	}		public static String replaceSpace(String iniString, int length) {        // write code here		int spaceCount = 0;		for(int i=0;i
=0;i--){ System.out.println(iniString.charAt(i) == ' '); if(iniString.charAt(i) == ' '){ newString[newLength-1] = '0'; newString[newLength-2] = '2'; newString[newLength-3] = '%'; newLength = newLength-3; }else{ newString[newLength-1] = iniString.charAt(i); newLength = newLength-1; } } StringBuffer buf = new StringBuffer(); newLength = length + spaceCount * 2; for(int i=0;i

 

面试题1.5:利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩” 后的字符串没有变短,则返回原先的字符串。

 

package cc150;public class Zipper {	public static void main(String[] args) {		// TODO 自动生成的方法存根		String str = "aabcccccaaa";		System.out.println(zipString(str));	}		public String zipString(String iniString) {        // write code here        int len = iniString.length();        String str = zip(iniString);        int lenzip = str.length();        if(lenzip < len)        	return str;        else        	return iniString;    }        public static String zip(String iniString) {        // write code here		String str = null;		if(iniString == null || iniString.length() <= 0)			return str;		char last = iniString.charAt(0);	//记录第一个字符		int length = iniString.length();		StringBuffer buf = new StringBuffer();		buf.append(last);						//把第一个字符放进buf		int count = 1;							//记录重复字符的数量		for(int i=1;i

 

面试题1.6:给定一幅有N×N矩阵表示的图像,其中每个像素的大小为4个字节,编写一个方法,将图像旋转90度。不占用额外内存空间能否做到?

package cc150;public class Transform {	public static void main(String[] args) {		// TODO 自动生成的方法存根		int[][] mat = {
{1,2,3},{4,5,6},{7,8,9}}; transformImage(mat, 3); for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ System.out.print(mat[i][j]); } } } public static int[][] transformImage(int[][] mat, int n) { // write code here for(int layer=0;layer

 

面试题1.7:编写一个算法,若M×N矩阵中某个元素为0,则将其所在的行与列清零。

  注意:一个一个清零会导致最后矩阵中所有的元素都变成零,所以要记录矩阵中所有零元素的位置再清零。并不用建立一个M×N的数组来标记零元素的位置,只用建立两个数组分别来记录每一个零元素的横坐标和纵坐标就行了。

package cc150;public class SetZeros {	public static void main(String[] args) {		// TODO 自动生成的方法存根		int[][] a = {				{1,0,3},				{4,5,6},		};		//原来的数组		for(int i=0;i

 

面试题1.8:假定有一个方法isSubstring,可检查一个单词是否为其他字符串的子串。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次isSubstring。(比如,waterbottle是erbottlewat旋转后的字符串。

  思路:令s1为waterbottle,s2为erbottlewat,则s2(erbottlewat)肯定是s1s1(waterbottlewaterbottle)的子串

package cc150;public class ReverseEqual {	public static void main(String[] args) {		// TODO 自动生成的方法存根		String s1 = "waterbottlea";		String s2 = "erbottlewatb";				System.out.println(checkReverseEqual(s1,s2));	}		public static boolean checkReverseEqual(String s1, String s2) {        // write code here		int len = s1.length();		if(len == s2.length() && len > 0){			String s1s1 = s1 + s1;			//return s1s1.indexOf(s2)>0;			return s1s1.contains(s2);		}		return false;    }}

 

转载地址:http://uaofo.baihongyu.com/

你可能感兴趣的文章
C语言位操作控件属性
查看>>
nginx的安装及基本配置,及多个域名服务
查看>>
Servlet访问postgresql数据库并提取数据显示在前端jsp页面
查看>>
不改一行代码定位线上性能问题
查看>>
定义运算符
查看>>
git管理
查看>>
告别暗黄皮肤变水嫩皮肤的8个小习惯
查看>>
加强Eclipse代码自动提示的方法
查看>>
GNS3-地址重叠环境中部署IPsec
查看>>
exchange online 用户疑问之许可证和用户数据归档
查看>>
QImage Mat IplImage 之间的相互转换
查看>>
使用eclipse与android studio 在开发自定义控件时的区别
查看>>
我的友情链接
查看>>
mysql学习笔记
查看>>
年年有鱼游戏Android源码项目
查看>>
java使用Iterator、for循环同步数据
查看>>
创建镜像iso文件
查看>>
Linux下创建软RAID5和RAID10实战
查看>>
C++类的存储
查看>>
ActiveReports 报表应用教程 (8)---交互式报表之动态过滤
查看>>