Careercup | Chapter 1
1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot use additional data structures?
字符串问题,需要先确定是不是只有ASCII码。
如果是,可以用char[256],也可以用位向量。位向量的实现参照《编程珠玑》。i&MASK就是取余。i>>SHIFT就是取商。
class BitVector {
public:
BitVector(int n) {
arr = new int[ + n / INT_LEN];
memset(arr, , ( + n / INT_LEN) * sizeof(int));
} ~BitVector() {delete[] arr;} void set(int i) {
arr[i >> SHIFT] |= ( << (i & MASK));
} void clear(int i) {
arr[i >> SHIFT] &= ~( << (i & MASK));
} bool isSet(int i) {
return (arr[i >> SHIFT] & ( << (i & MASK)));
} private:
int* arr;
enum {INT_LEN = , SHIFT = , MASK = 0x1f};
}; bool unique(char *p) {
bool ch[];
memset(ch, false, sizeof(bool) * );
while (*p) {
if (ch[*p]) return false;
ch[*p] = true;
p++;
}
return true;
} bool unique2(char *p) {
BitVector bv(); while (*p) {
if (bv.isSet(*p)) return false;
bv.set(*p);
p++;
}
return true;
}
1.2 Implement a function void reversefchar* str) in C or C++ which reverses a null-terminated string.
void reverse(char* str) {
if (str == NULL) return;
int n = strlen(str);
int i = , j = n - ;
while (i < j) {
swap(str[i], str[j]);
i++;
j--;
}
}
1.3 Given two strings, write a method to decide if one is a permutation of the other。
忘了一点,就是要先确认是不是case sensitive和whitespace significant。
bool isPerm(char* s1, char* s2) {
int n1 = strlen(s1), n2 = strlen(s2);
if (n1 != n2) return false;
sort(s1, s1 + n1);
sort(s2, s2 + n2);
return strcmp(s1, s2) == ;
} bool isPerm2(char* s1, char* s2) {
int ch[];
memset(ch, , sizeof(int) * ); while (*s1) ch[*s1++]++;
while (*s2) {
if (--ch[*s2++] < ) return false;
}
return true;
}
1.4 Write a method to replace all spaces in a string with '%20'. You may assume that the string has sufficient space at the end of the string to hold the additional characters, and that you are given the "true" length of the string.
char* replaceSpace(char* str) {
int b = ;
char *p = str;
while (*p != '\0') if (*p++ == ' ') b++; char *np = p + (b << );
while (p >= str) {
if (*p == ' ') {
*np-- = '';
*np-- = '';
*np-- = '%';
} else {
*np-- = *p;
}
p--;
}
return str;
}
如果最左和最右的空格不需要替代,那么情况就会复杂一些,不能in place地实现了。
写的有点乱。
char* replaceSpace2(char* str) {
char *p = str;
while (*p && *p == ' ') p++;
if (!*p) return str;
str = p;
int b = , n = ;
char *t;
while (*p) {
if (*p != ' ') {
n++;
t = p;
} else b++;
p++;
}
b -= (p - t - );
n += b;
char * newstr = new char[n + b * ];
p = newstr;
for (int i = ; i < n; ++i) {
if (str[i] == ' ') {
*p++ = '%';
*p++ = '';
*p++ = '';
} else {
*p++ = str[i];
}
}
*p = '\0';
return newstr;
}
1.5 Implement a method to perform basic string compression using the counts of repeated characters. For example, the string aabcccccaaa would become a2blc5a3. If the "compressed" string would not become smaller than the original string, your method should return the original string.
careercup上的code是O(n)时间复杂度和O(n)空间复杂度。另外就是不用stringbuffer的字符串拼接的开销是O(n^2)。
int digits(int n) {
int i = ;
while (n > ) {
n /= ;
i++;
}
return i;
} int int2str(int n, char *s) {
int i = ;
while (n > ) {
s[i++] = n % + '';
n /= ;
} int k = , m = i - ;
while (k < m) {
swap(s[k], s[m]);
k++;
m--;
}
return i;
} char* compress(char* str) {
if (str == NULL) return str;
char *p = str;
int n1 = , n2 = , n;
while (*p) {
char *t = p;
while (*p && *p == *t) p++;
n = p - t;
n1 += n;
n2 += + digits(n);
}
if (n2 >= n1) return str;
cout << n2 << endl;
char *s = new char[n2];
int i = ;
p = str;
while (*p) {
char *t = p;
while (*p && *p == *t) p++;
n = p - t;
s[i++] = *t;
i += int2str(n, s + i);
}
s[i] = '\0';
return s;
}
1.6 Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place?
Leetcode有,点此。
1.7 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column are set to 0.
Leetcode有,点此。
1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check If s2 is a rotation of s1 using only one call to isSubstring (e.g., "waterbottLe" is a rotation of "erbottLewat").
如果s2是s1旋转而来的,那么s1和s2的长度一定相同,s2一定是s1+s1的子串。反过来亦然。
原命题很显然。逆命题证明如下:
假设s1和s2长度相同,s2是s1+s1的子串。假设s1+s1=x+s2+y,令s2=m+n,使得len(x)+len(m)=len(s1),那么s1+s1=x+m+n+y;
于是有x+m=n+y=s1;且len(y)=len(s1)-len(n)=len(s2)-len(n)=len(m)。同理可证len(x)=len(n)。
因为len(y)=len(m),len(x)=len(n),x+m=n+y=s1,所以有x=n,y=m。于是s1=x+m=x+y,s2=m+n=y+x。所以s2是s1旋转而来的。
bool isRotate(string s1, string s2) {
if (s1.length() != s2.length()) return false;
string s1s1 = s1 + s1;
return (s1s1.find(s2) != string::npos); //isSubstring
}
Careercup | Chapter 1的更多相关文章
- Careercup | Chapter 3
3.1 Describe how you could use a single array to implement three stacks. Flexible Divisions的方案,当某个栈满 ...
- Careercup | Chapter 2
链表的题里面,快慢指针.双指针用得很多. 2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow w ...
- Careercup | Chapter 8
8.2 Imagine you have a call center with three levels of employees: respondent, manager, and director ...
- Careercup | Chapter 7
7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...
- CareerCup Chapter 9 Sorting and Searching
9.1 You are given two sorted arrays, A and B, and A has a large enough buffer at the end to hold B. ...
- CareerCup chapter 1 Arrays and Strings
1.Implement an algorithm to determine if a string has all unique characters What if you can not use ...
- CareerCup Chapter 4 Trees and Graphs
struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val):val(val),left(NULL),rig ...
- Careercup | Chapter 6
6.2 There is an 8x8 chess board in which two diagonally opposite corners have been cut off. You are ...
- Careercup | Chapter 5
5.1 You are given two 32-bit numbers, N andM, and two bit positions, i and j. Write a method to inse ...
随机推荐
- 有三个线程T1 T2 T3,如何保证他们按顺序执行
T3先执行,在T3的run中,调用t2.join,让t2执行完成后再执行t3 在T2的run中,调用t1.join,让t1执行完成后再让T2执行 public class JoinTest { ...
- Android Shader渲染器:BitmapShader图片渲染
public class BitmapShader extends Shader BitmapShader, Shader家族的 专门处理图片渲染的 构造方法: public BitmapShade ...
- [原]sencha touch之表单(login demo)
现在来说说sencha touch中的表单,举个简单的login的例子,相关的说明我都放在了注释中,看下面代码 Ext.application({ id:'itKingApp', launch:fun ...
- C++ STL map容器的说明测试1
// maptest.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" /*********************************** ...
- 目前问题:plupload上传带参数到后台
目前问题:plupload上传带参数到后台,迟迟没有解决!!! 昨晚到23点多终于完成了! 直接上代码! var uploader = new plupload.Uploader({ //实例化一个p ...
- mysql导入导出命令详解
mysql导入导出命令详解 该命令适用于临时备份操作. 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): /usr/local/mysql/bin/ ---> ...
- Struts2,get/set 自动获取/设置数据ActionSupport 类
主页:http://struts.apache.org/在用户请求和模块化处理方面以及页面的展现这块,Struts2 发挥了强大的作用:相对于传统的Jsp+Servlet 模式,Struts2 更适合 ...
- WINDOWS开发PHP7扩展
最近在做个项目,需要用到唯一ID的生成,原本在Java和Delphi中,做了一个生成20位字符串(160bit)形式的唯一ID的算法,但是对比GUID(128bit),除了看起来比他短之外,其他并无优 ...
- Ubuntu系统设置中心不见了
sudo apt-get install unity-control-center 执行安装上述即可 原因是因为在安装搜狗输入法的时候卸载了ibuts与系统控制中心
- (转)iOS-蓝牙学习资源博文收集
ios蓝牙开发(一)蓝牙相关基础知识 ios蓝牙开发(二)蓝牙中心模式的ios代码实现 ios蓝牙开发(三)app作为外设被连接的实现 ios蓝牙开发(四)BabyBluetooth蓝牙库介绍 暂未完 ...