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 ...
随机推荐
- C#+VisionPro连接相机获取图像的两种方式
两种比较常用的方式. C#直接连接相机获取图像(GIGE) 在获取图像前,需要先创建一个相机对象,再使用这个相机对象的Acquire方法拍摄照片. ICogAcqFifo macqfifo;//定义相 ...
- leetcode 【 Search Insert Position 】python 实现
题目: Given a sorted array and a target value, return the index if the target is found. If not, return ...
- dotfiles项目
1.dotfile介绍 在linux中的各种软件配置文件大多是以.开头,以rc结尾,在第一次使用某一个软件比如vim的时候,通常会花大量时间配置,将所有的配置文件放到同一个目录下,方便在多台机器上同步 ...
- 实用拜占庭容错算法PBFT
实用拜占庭容错算法PBFT 实用拜占庭容错算法PBFT 96 乔延宏 2017.06.19 22:58* 字数 1699 阅读 4972评论 0喜欢 11 分布式架构遭遇的问题 分布式架构会遭遇到以下 ...
- [oldboy-django][2深入django]登录注册页面验证码
后台生成随机验证码 #验证码生成 - 在login.html 中有一张验证码图片 设置图片的src url, 相当于发送一次get请求,返回的内容为图片渲染的内容 <div class=&quo ...
- python 中输入一个字符串,判断这个字符串中有多少个字符、数字、空格、特殊字符
# -*- coding: utf8 -*- # Author:wxq #python 2.7 #首先定义一个字符串 str1 = raw_input('请输入一个字符:') #初始化字符.数字.空格 ...
- 一些echarts的基本图形
先拿一个图形渲染过程举例 引用处 <bar ref="ARPUChart" v-if="ARPUChart" style="width:500p ...
- POJ 3254:Corn Fields(状态压缩DP)
题目大意:一个矩形的草地,分为多个格子,有的格子可以有奶牛(标为1),有的格子不可以放置奶牛(标为0),计算摆放奶牛的方案数. 分析: f[i,j]表示第i行状态为j的方案总数. 状态转移方程f[i, ...
- 关于jena-fuseki SPARQL query版本问题的解决方案
在做“Apache jena SPARQL endpoint及推理”时,遇到了不少问题,主要原因是jena-fuseki版本更新了.以下对问题解决方案做下笔记.想了解更多,请查阅底部参考文献. Que ...
- spring项目启动报错BeanFactory not initialized or already closed
spring项目启动的时候报如下错误: java.lang.IllegalStateException: BeanFactory not initialized or already closed - ...