一.数据结构

1.数组与字符串

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

/*
假设字符集为ASCII字符串,那么字符串至多有256个字符,因为一旦大于256个则必定有两个是相同的
*/
#include<iostream>
#include<string>
using namespace std; bool isUniqueChars(string str){
if (str.size() > )
return false;
bool char_set[];
for(int i = ; i < str.size; ++i) {
int val = str[i]; //获取字符对应得ASCII码
if (char_set[val]) //这个字符已经在字符串中出现
return false;
char_set[val] = ;
}
return true;
} /*
假如输入的字符只含有小写字母a到z,则我们只需要用一个int型变量
*/ bool isUniqueChar2(string str) {
int flag = ;
if (str.size() > )
return false;
for (int i = ; i < ; ++i) {
int val = str[i] - 'a';
if (flag&( << val) > )
return false;
flag |= ( << val);
}
return true;
}

1.2  用C或C++实现void reverse(char* str)函数,即反转一个null结尾的字符串。

/*假设原地反转,不分配额外空间,下面为C语言实现*/
#include<stdio.h> void reverse(char* str) {
char* end = str;
char* start = str;
char tmp;
if (str) {
while (*end)
++end;
}
--end; /*回退一个字符,因为最后的字符为null*/ /*从首尾开始交换*/
while (start < end) {
tmp = *end;
*end = *start;
*start = tmp;
++start;
--end;
}
}

1.3  给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另外一个字符串。

/*给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另外一个字符串。*/
/*假设字符区分大小写,空白字符也考虑在内,以下是两种解法,使用C++*/
#include<iostream>
#include<string>
#include <algorithm>
using namespace std; /*解法一:排序字符串,将两个字符串进行排序后再进行比较*/
bool permutation1(string s, string t) {
if (s.size() != t.size())
return false;
string s1 = s;
string t1 = t;
/*进行排序*/
sort(s1.begin(), s1.end());
sort(t1.begin(), t1.end());
if (s1 == t1)
return true;
return false;
} /*解法二:比较两个字符串各字符数是否相同*/
bool permutation2(string s, string t) {
if (s.size() != t.size())
return false;
int count[] = { };
/*计算s中各个字符出现的次数*/
for (string::size_type i = ; i !=s.size(); ++i) {
int val = (int)s[i];
count[val]++;
}
for (string::size_type j = ; j != t.size(); ++j) {
int c = (int) t[j];
if (--count[c] < )
return false;
}
return true;
}

1.4  编写一个方法,将字符串中的空格全部替换成“%20”。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的真实长度。例如,输入:"Mr Jone Smith",输出:“Mr20%Jone20%Smith”。

/*编写一个方法,将字符串中的空格全部替换成“%20”。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的真实长度。*/
/*例如,输入:"Mr Jone Smith",输出:“Mr20%Jone20%Smith”。*/ #include<iostream>
#include<string>
using namespace std; void replaceSpaces(char* str,int length) {
int spaceCount = ;
for (int i = ; i < length; ++i) {
if (str[i] == ' ')
++spaceCount;
}
int newLength = length + spaceCount * ;
str[newLength] = '\0';
int p = length - ;
int q = newLength - ;
while (p < q) {
if (str[p] != ' ')
str[q--] = str[p--];
else
{
str[q--] = '';
str[q--] = '';
str[q--] = '%';
p--;
}
} }

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

#include<iostream>
#include<string>
using namespace std; string compress(string str) {
if (str.empty())
return NULL;
string str1;
char last = str[];
int count = ;
for (string::size_type i = ; i < str.size(); ++i) {
if (str[i] == last)
++count;
else {
str1.push_back(last);
str1+=to_string(count);
last = str[i];
count = ;
}
}
/*因为最后一组重复字符还未放入压缩字符串中就退出循环,所以还要更新最后一组字符*/
str1.push_back(last);
str1+=to_string(count); return str1.size() < str.size() ? str1: str;
}

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

/*假设顺时针旋转,*/
#include<iostream>
using namespace std; void rotate(int** matrix, int n) {
for (int layer = ; layer < n / ; ++layer) {
int first = layer;
int last = n - - 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,则将其所在的行与列清零。

void setZeros(vector<vector<int> > matrix) {
bool *row= new bool[matrix.size()];
bool *column= new bool[matrix[].size()]; //为保险起见首先初始化为false
for (int i = ; i < matrix.size(); ++i) {
for (int j = ; j < matrix[].size(); ++j) {
row[i] = false;
column[j] = false;
}
}
//记录值为0的元素所在的行的索引和列的索引
for (int i = ; i < matrix.size(); ++i) {
for (int j = ; j < matrix[].size(); ++j) {
if (matrix[i][j] == )
{
row[i] = true;
column[j] = true;
}
}
} //若行i或列j有个元素为0,则matrix[i][j]置为0
for (int i = ; i < matrix.size(); ++i) {
for (int j = ; j < matrix[].size(); ++j) {
if(row[i]||column[j])
matrix[i][j] = ;
}
} }

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

/*
*假设s2由s1旋转而成,那么我们可以找出旋转点在哪。例如,若以wat旋转waterbottle,就会得到erbottlewat。
*我们把字符串s1切分为两部分x和y,并将它们重新组合成s2.
*s1=xy=waterbottle
*x=wat
*yerbottle
*s2=yx=erbottlewat
*我们需要确认的是有没有办法将s1切分成xy=s1,yx=s2。不论xy的分割点在何处,xy都是xyxy的子串。也即s2是s1s1的子串
*/
#include<iostream>
using namespace std; bool isRotation(string s1, string s2) {
int len = s1.size();
//检查s1和s2是否等长且不为空
if (len == s1.size() && len > ) {
//凭借s1和s1,放入新字符串中
string s1s1 = s1 + s1;
return isSubstring(s1s1, s2);
}
return false;
}

2.链表

2.1  编写代码,移除为排序链表中的重复节点。进阶:如果不得使用临时缓冲区,该怎么解决?

#include<iostream>
#include<map>
using namespace std; //链表节点定义
struct Node {
Node* next = NULL;
int data;
}; /*解法一:采用散列表来存储节点的值是否出现过,若重复,则删除该节点。*/
void deleteDups1(Node *phead) {
map<int, bool> imap;
Node* previous = phead;
Node* p = phead; while (p != NULL) {
if (imap[p->data])
{
previous->next =p->next;
}
else {
imap[p->data] = true;
previous = p; }
p = p->next;
}
} /*解法二:进阶不使用额外缓冲区,使用两个指针来迭代:current迭代访问整个列表,runner用于检查后续的节点是否重复*/
void deleteDups2(Node* phead) {
if (phead == NULL)
return;
Node* current = phead;
while (current != NULL) {
Node* runner = current;
while (runner->next != NULL) {
if (current->data == runner->next->data) {
current->next = runner->next->next;
}
else {
runner = runner->next;
}
current = current->next;
}
}
}

《程序员面试金典》习题解答(C/C++)的更多相关文章

  1. 九度OJ 上剑指 offer 习题目录

    <剑指Offer>面试题集收录汇总 面试题1 赋值运算符函数 不适合在线模式 面试题2 实现Singleton模式 不适合在线模式 面试题3 二维数组中的查找 已收录 面试题4 替换空格 ...

  2. 剑指offer题目解答合集(C++版)

    数组中重复的数字 二维数组中查找 字符串 替换空格 二叉树的编码和解码 从尾到头打印链表 重建二叉树 二叉树的下一个节点 2个栈实现队列 斐波那契数列 旋转数字 矩阵中的路径 机器人的运动范围 剪绳子 ...

  3. 【剑指Offer面试编程题】题目1354:和为S的连续正数序列--九度OJ

    题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久, ...

  4. 【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ

    题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数 ...

  5. 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ

    题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n&l ...

  6. 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ

    题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...

  7. 【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ

    题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每个 ...

  8. 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ

    题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...

  9. 【剑指Offer面试编程题】题目1355:扑克牌顺子--九度OJ

    题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...

  10. 【剑指Offer面试编程题】题目1360:乐透之猜数游戏--九度OJ

    题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备了一些不同类型的骰子,打算以掷骰子猜数字的方式发放奖品.例如,有的骰子有6个点数(点数 ...

随机推荐

  1. 20145122《Java程序设计》第九周学习总结

    教材学习内容总结 1.JDBC代表Java数据库连接,这是一个标准的Java API与数据库无关的与Java编程语言之间的和大多数数据库连接.JDBC API支持两层和三层的处理模式对数据库的访问,但 ...

  2. Mysql中unique与primary约束的区别分析(转)

    本文章来给大家介绍在mysql中unique与primary约束的区别分析,unique与primary是我们在创建mysql时常用的类型了,下面我来给大家介绍介绍.   定义了UNIQUE约束的字段 ...

  3. 51nod 1106 质数检测

    #include <bits/stdc++.h> using namespace std; int n; ; bool s[maxn]; void is_prime() { memset( ...

  4. HDU 1863 畅通工程 (最小生成树

    看卿学姐视频学到的题目 kruskal算法实现最小生成树 #include<bits/stdc++.h> using namespace std; ; typedef long long ...

  5. 2018提高组训练Day2

    A 算法 1 对于每组询问,暴力的算出每个二次函数的取值. 时间复杂度 \(O(nq)\).期望得分 \(20\) 分. 算法 2 当 \(x>0\) 时,要求 \(a_ix^2+b_ix\) ...

  6. JS post 数组道后台

    $("#aSave").click(function () { if ($("#TaskName").val() == "") { aler ...

  7. Linux——系统引导流程学习简单笔记

    开启电源: 固件 firmware(CMOS/BIOS) → POST 加电自检 对硬件就行检查 ↓ 自举程序 BootLoader(GRUB) → 载入内核 ↓ 载入内核 Kernel 1:驱动硬件 ...

  8. C++:delete不完整类型的指针

    简单版 以下代码编译时会有warning: class X; void foo(X* x) { delete x; } 在GCC4.1.2下,编译出错信息是: warning: possible pr ...

  9. shell 判断字符串是否为空

    #!/bin/bash a="" if [ -n "$a" ] then echo "-n $a : 字符串长度不为 0" else ech ...

  10. shell 杀掉指定进程的服务

    check_results=`ps -ef|grep bp_driver.launch|awk '{print $2}'|sed -n 1p` echo `kill - $check_results` ...