1.1实现一个算法判断一个字符串是否存在重复字符。如果不能利用另外的数据结构又该如何实现?

My solution:

/**
*利用类似一个hash table的计数
*然后检查这个hash table计数,时间复杂度(n)
*/
int unique_string1(char *array,int length)
{
int CARRAY[26] = {0};
int i;
if(length > 26)
return 0;
for (i = 0;i < length;i++)
CARRAY[array[i]-'a']++;
for (i = 0;i < 26;i++)
if (CARRAY[i] > 1)
return 0;
return 1;
}

  

/**
*直接双重循环检查,时间复杂度O(n^2)
*/
int unique_string2(char *array,int length)
{
int i,j;
if(length > 26)
return 0;
for (i = 0;i < length;i++)
for(j = i+1;j < length;j++)
if (array[i] == array[j])
return 0;
return 1;
}

 The Solution that the book advice:

1.思路类似于我第一种实现的方法,但是其中是一个存放boolean值的hashtable,遇到一个字符将其位置设置为true,检查每次遇到的字符hashtable的位置boolean值是否被设置,时间复杂度O(n),但是略优于我的实现。

2.不能利用额外的数据结构,但是仍然不增加时间复杂度的另外一种方法,利用bit vector,即每一位记录当做一个boolean值对待,这样如果仅仅26个字符,则一个整形int即可,其占32位。

3.另外还有一些其他的思路,比如排序。时间复杂度为O(nlgn)

1.2实现一个逆序C-String字符串的方法。

My Solution:

void swap(char &a,char &b)
{
char temp;
temp = a;
a = b;
b = temp;
return;
}
void reverse_Cstring(char *array,int length)
{
if(length == 0)
return;
int i;
for (i = 0;i < length/2;i++)
{
swap(array[i],array[length-1-i]);
}
return;
}

The Solution that the book advice:

其实思路是类似的,但是可能C-String不能得到length这个值,所以解决办法是检查直到遇到C-String的结尾字符。'\0'

1.3设计一个移除String中重复字符的算法并且不能够利用额外的buffer。

My Solution:

int remove_dupchar(char *array,int length)
{
int i,j,k;
for(i = 0;i < length;i++)
for (j = i+1;j < length;j++)
if (array[i] == array[j])
{
for (k = j+1;k < length;k++)
array[k-1] = array[k];
length --;
j --;
}
array[length] = '\0';
return length;
}

  The Solution that the book advice:

1. step1,for each character,check if it is a duplicate of already found characters. step2,skip duplicate characters and update the non duplicate characters.

code:

public static void removeDuplicates(char[] str) {
if(str == null) return;
int len = str.length();
if(len < 2) return;
int i,j;
int tail = 1;
for(i = 1;i < len;i++) {
for(j = 0;j < i;j++) {
if(str[i] == str[j]) break;
}
if(j == tail) {
str[tail++]=str[i];
}
}
str[tail]=0;
}

  

2.利用常量长度的额外内存。

code:

public static void removeDuplicatesEff(char[] str) {
if (str == null) return;
int len = str.length();
if(len < 2) return;
boolean[] hashtablesign = new boolean[256];
int i;
for(i = 0;i < len;i++) {
hashtablesign[i]=false;
}
hashtablesign[str[0]] = true;
int tail = 1;
for(i = 1;i < len;i++) {
if(!hashtablesign[str[i]]) {
str[tail++] = str[i];
hashtablesign[str[i]] = true;
}
str[tail]=0;
}

  

1.4实现一个判断两个字符串是否回文的方法。(回文:两个字符串由相同的字符组成,顺序可以不同)

My Solution:

int is_anagram(char *a,char *b,int length)
{
int CARRAY[26]={0};
int i;
for (i = 0;i < length;i ++)
{
CARRAY[a[i]-'a']++;
CARRAY[b[i]-'a']--;
}
for (i = 0;i < 26;i++)
{
if (CARRAY[i] != 0)
{
return 0;
}
}
return 1;
}

  

1.5实现一个方法,将一个字符串中的空格替换为"%20"

My Solution:

char* replace_space(char *array,int length)
{
int i;
int s_count = 0;
for (i = 0;i < length;i++)
{
if (array[i] == ' ')
{
s_count++;
}
}
int j = 0;
int new_length = (length-s_count)+3*s_count;
char *new_array = new char[new_length];
for (i = 0;i < length;i++)
{
if (array[i] == ' ')
{
new_array[j++] = '%';
new_array[j++] = '2';
new_array[j++] = '0';
}
else
{
new_array[j++]=array[i];
}
}
return new_array;
}

1.6给出一个N*N的矩阵。每个像素点4bytes,实现一个方法将该矩阵旋转90度。可以不利用额外的存储空间实现吗?

My Solution:

不利用额外的存储空间有一句叫in place,快速排序也可以成为原地排序。

public static void rotate(int [][] matrix,int n) {
for( int layer = 0;layer < n/2;layer++) {
int first = layer;
int last = n-1-layer;
for(int i = first;i<last;i++) {
int offset = i - first;
int top = matrix[first][i];
matrix[first][i]=matrix[last-offset][first];
matrix[last-offset][first]=matrix[last][last-offset];
matrix[last][last-offset]=matrix[i][last];
matrix[i][last]=top;
}
}
}

  

1.7实现如下方法,如果一个M*N的矩阵中存在0元素,则将其行和列均设置为0。

My Solution:

这个题目容易犯错的地方在于如果是碰到一个0元素就将其行列置为0肯定最终得不到正确的结果,所以首先第一轮要保存0元素出现的位置,第二轮在设置行列为0.

1.8假设你现在已经实现了一个方法isSubString来检查一个字符串是否为另一个字符串的子串。现在给出两个字符串s1,s2,实现方法判断s2是否为s1的轮换通过只调用isSubString一次。

My Solution:

这个问题真的没有想到解决方案,但是看到答案之后发现题目真的很easy的。

The Solution that the book advice:

思路就是,将s2重新复制一遍然后连接起来,检查s1是否为s2的字串即可。

例如:s2=“cdab”,s1=“abcd”,首先s2扩展为 “cdabcdab”,检查s1是否为s2的子串即可。

public static void check(String str1 , String str2) {
int len = str1.length();
if(len == str2.length() && len > 0) {
String str1str1 = str1+str1;
return isSubString(str1str1,str2);
}
return false;
}

  

Cracking the Coding Interview(String and array)的更多相关文章

  1. Cracking the Coding Interview(Trees and Graphs)

    Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...

  2. Cracking the Coding Interview(Stacks and Queues)

    Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...

  3. Cracking the Coding Interview 题目分析笔记—— Array and String

    1.Determine if a string has all unique characters learn: 为了减少空间利用率,其比较优秀的算法一般都适用位操作 返回值的命名方法,我们需要学习 ...

  4. 二刷Cracking the Coding Interview(CC150第五版)

    第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...

  5. Cracking the Coding Interview(linked list)

    第二章的内容主要是关于链表的一些问题. 基础代码: class LinkNode { public: int linknum; LinkNode *next; int isvisit; protect ...

  6. Cracking the coding interview

    写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...

  7. Cracking the coding interview 第一章问题及解答

    Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...

  8. 《Cracking the Coding Interview》读书笔记

    <Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...

  9. Cracking the coding interview目录及资料收集

    前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...

随机推荐

  1. ScrollView子控件高度设置无效

    ScrollView子控件高度设置无效 简述 项目中引入了第三方的下拉刷新包PullToRefreshScrollView. 由于我之前布局未考虑下拉刷新功能.后来暂时发现添加上去,发现.子控件的高度 ...

  2. 两台linux服务器之间实现挂载

    https://blog.csdn.net/lpp_dd/article/details/78743862 两台linux服务器之间实现挂载: 服务端: 1.首先需要在主机上设置允许挂载的目录 (1) ...

  3. symfony window下的安装 安装时候出现的问题以及解决方案

    1. cmd进入DOS  , cd 到 php.exe 的目录下 2.         php -r "readfile('http://symfony.com/installer');&q ...

  4. mongo文件空间

    mongo的文件空间,是由一个一个的文件空间组成,如下图 在mongodb刚安装完成时只有一个指定的db都只有一个文件空间而已,例如这里的db是filedb 那么他的第一个文件空间为filedb.0, ...

  5. Java使用选择排序法对数组排序

    编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象: 使用JTextArea的setTex ...

  6. 通过SSH实现Windows与linux之间传输文件

    Linux是非常好的开发环境,但很多时候我们希望能够在Windows上操作,通过SSH协议可以实现两者之间传输文件. 一 需要在Linux系统上安装ssh-server,有的linux系统自带了. 查 ...

  7. 【安全开发】java安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...

  8. NFS 简介

    一.NFS 简介 1. NFS(Network File System)网络文件系统,它允许网络中的计算机之间通过 TCP/IP 网络共享资源2. NFS 应用场景:A,B,C 三台机器上需要保证被访 ...

  9. BugHD 与你的应用一起成长

    BugHD 新增功能 1.新增安装量.启动量的统计功能 BugHD SDK 1.3.0新增安装量.启动量的统计功能,在崩溃分析页面右上角可看到安装量和启动量. BugHD 体验优化 1.Android ...

  10. 【译】Apache Flink Kafka consumer

    Flink提供了Kafka connector用于消费/生产Apache Kafka topic的数据.Flink的Kafka consumer集成了checkpoint机制以提供精确一次的处理语义. ...