剑指offer
今天完成了剑指offer上的66道编程题,感觉自己还是很多代码实现能力和算法积累都还不够!还需要继续联系,坚持自己独立写代码实现。
最后将今天的两道题目奉上,都有异曲同工之妙:
矩阵中的路径:
#include<memory.h> //题目描述
//
//请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
//路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
//如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
//例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,
//因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。 //思路
//深搜的基本题型,分别以每个格子为起点,往四个方向去遍历,直到找到符合题意的字符串即可
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if (matrix==nullptr||str==nullptr||rows<||cols<)
{
return false;
}
//建立一个标记数组,走过的位置为true,没走过的为false
bool *vis = new bool[rows*cols];
memset(vis,false,rows*cols);
int pathLength = ;
for (size_t i = ; i < rows; i++)
{
for (size_t j = ; j < cols; j++)
{
if (hasPathCore(matrix,rows,cols,i,j,str,pathLength,vis))
{
return true;
}
}
}
delete[]vis;
return false;
}
//判断从一个元素出发是否能找到一条路径
bool hasPathCore(char *matrix,int rows,int cols,int x,int y,char *str,int pathLength,bool *vis)
{
if (str[pathLength]=='\0')//嵌套调用出口
{
return true;
}
bool hasPath = false;//函数返回值
if (x>=&&x<=rows&&y>=&&y<=cols&&matrix[x*cols+y]==str[pathLength]&&!vis[x*cols+y])//坐标范围判断,x=0开始,所以x*cols+y索引正确
{
++pathLength;
vis[x*cols + y] = true;
hasPath = hasPathCore(matrix, rows, cols, x - , y, str, pathLength, vis)
|| hasPathCore(matrix, rows, cols, x + , y, str, pathLength, vis)
|| hasPathCore(matrix, rows, cols, x, y - , str, pathLength, vis)
|| hasPathCore(matrix, rows, cols, x, y + , str, pathLength, vis);
if (!hasPath) //没有路径时,返回到原来位置
{
--pathLength;
vis[x*cols + y] = false;
}
}
return hasPath;
}
};
//题目描述:机器人的运动范围
//
//地上有一个m行和n列的方格。一个机器人从坐标0, 0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,
//但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35, 37),因为3 + 5 + 3 + 7 = 18。
//但是,它不能进入方格(35, 38),因为3 + 5 + 3 + 8 = 19。请问该机器人能够达到多少个格子? //思路
//深搜基础题,从0开始按照四个方向递归求解即可
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
bool *vis = new bool[rows*cols];
memset(vis,false,rows*cols);
int result = movingCountCore(threshold,rows,cols,,,vis);
delete[]vis;
return result;
}
int movingCountCore(int threshold,int rows,int cols,int x,int y,bool *vis)
{
int count = ;
if (x >= && x<rows && y >= && y<cols && getSum(x) + getSum(y) <= threshold && !vis[x*cols + y])
{
vis[x*cols + y] = true;
count = + movingCountCore(threshold, rows, cols, x - , y, vis)
+ movingCountCore(threshold, rows, cols, x + , y, vis)
+ movingCountCore(threshold, rows, cols, x, y - , vis)
+ movingCountCore(threshold, rows, cols, x, y + , vis);
}
return count;
}
int getSum(int num)
{
int sum = ;
while (num)
{
sum += num % ;//先取各位
num /= ;//从低到高位
}
return sum;
}
};
剑指offer的更多相关文章
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- 剑指Offer面试题:14.链表的倒数第k个节点
PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...
- 《剑指offer》面试题12:打印1到最大的n位数
面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...
- 《剑指offer》面试题11: 数值的整数次方
面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...
- 剑指 Offer 题目汇总索引
剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格 ...
- 面试题目——《剑指Offer》
1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...
- 剑指offer习题集2
1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...
- 剑指offer习题集1
1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...
- 剑指Offer:面试题20——顺时针打印矩阵(java实现)
题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...
- 牛客网上的剑指offer题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
随机推荐
- C++调用python
本文以实例code讲解 C++ 调用 python 的方法. 本文在util.h中实现三个函数: 1. init_log: 用google log(glog)初始化log 2. exe_command ...
- [原]poj-2680-Choose the best route-dijkstra(基础最短路)
题目大意: 已知n 个点,m条路线,s为终点:给出m条路线及其权值:给出w个起点,求最短路! 思路:基础的dijkstra,有向无环正权最短路,只要把终点和起点 reverse考虑便可. AC代码如下 ...
- Gumshoe - Microsoft Code Coverage Test Toolset
Gumshoe - Microsoft Code Coverage Test Toolset 2014-07-17 What is Gumshoe? How to instrument a binar ...
- 四大开源协议:BSD、Apache、GPL、LGPL
参考文献:http://www.fsf.org/licensing/licenses/ 现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种.我 ...
- 谈谈 char *num="123";和char num[4]="123";的区别
最近写程序的时候发现这样一个问题 #include<iostream> #include <string.h> using namespace std; void revers ...
- noi2015的回忆和教训
前几天偶然打开了bzoj的rank list,突然发现——我竟然掉出了第一版!!! 自从我5月还是6月刷进第一版之后,我曾经天真的以为大概半年之内我还能保留在第一版内吧. 结果仅仅短短的4个月,我就已 ...
- UVa 1611 (排序 模拟) Crane
假设数字1~i-1已经全部归位,则第i到第n个数为无序区间. 如果i在无序区间的前半段,那么直接将i换到第i个位置上. 否则先将i换到无序区间的前半段,再将i归位.这样每个数最多操作两次即可归位. # ...
- UVa (二分) 11627 Slalom
题意: 有宽度相同的水平的n个旗门,水平(纵坐标严格递增)滑行的最大速度为Vh(水平速度可以任意调节).然后还有S双滑雪板,每双滑雪板的垂直速度一定. 然后求能通过的滑板鞋的最大速度. 分析: 显然, ...
- IOS中封装一个View的思路
一.封装一个View的思路 1.将View内部的业务逻辑(显示内容)封装到View中 2.一般情况下,View的位置应该由父控件来决定,也就是位置不应该固定死在View内部 3.至于View的宽高,根 ...
- HDU 5268 ZYB loves Score (简单模拟,水)
题意:计算Bestcoder四题的得分. 思路:直接模拟,4项分数直接计算后输出.注意不要低于百分之40的分. //#include <bits/stdc++.h> #include &l ...