int函数

[数组]顺时针打印螺旋矩阵

僤鯓⒐⒋嵵緔 提交于 2020-03-31 05:03:46
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。 分析:第一次看到这个题目的时候,觉得这个题目很简单,完全不需要用到数据结构或者算法的知识,因此没有兴趣做这道题。后来听到包括Autodesk、EMC在内的多家公司在面试或者笔试里采用过这道题,于是想这么多家公司用它来检验一个程序员的编程功底总是有原因的,于是决定自己写一遍试一下。真正写一遍才发现,要完整写出这道题的代码,还真不是件容易的事情。 解决这道题的难度在于代码中会包含很多个循环,而且还有多个边界条件需要判断。如果在把问题考虑得很清楚之前就开始写代码,不可避免地会越写越混乱。因此解决这个问题的关键,在于先要形成清晰的思路,并把复杂的问题分解成若干个简单的问题。下面分享我分析这个问题的过程。 通常当我们遇到一个复杂的问题的时候,我们可以用图形帮助我们思考。由于我们是以从外圈到内圈的顺序依次打印,我们在矩阵中标注一圈作为我们分析的目标。在下图中,我们设矩阵的宽度为columns,而其高度为rows。我们我们选取左上角坐标为(startX, startY),右下角坐标为(endX,

typedef用法 与#define

为君一笑 提交于 2020-03-31 00:45:08
typedef根据名字就知道是对类的定义。但是值得注意的是,它并不定义新的类型,而是对已有的类型定义一个其他的名字。本人生就略愚,常常搞不清与#define的关系,难道仅仅是所定义得到的新类型所在的位置不同吗?首先我们仔细看看typedef。 一、typedef的用法 人说typedef的使用可以编写更加美观和可读的代码,原因是typedef可以隐藏笨拙的语法结构以及平台相关的数据类型,从而增加可移植性及 未来的可维护性。对于typedef的用法,一般如下:原始类型一般紧紧临着typedef,最右边是声明的新的类型名字(其实就是原始类型的一种表 示)。例如 typedef int INT;这里声明了一个与int同意的类型INT。如此以来int a;与INT a;并没什么本质的区别。 typedef还可以掩盖复合类型,例如指针、数组、函数指针。例如,定义char value1[80], value2[80];可以优化一下:typedef char LINE[80]; LINE value1,value2;指针定义:typedef (int*) PINT;PINT szA,szB;等同与int* szA,*szB.对函数指针定义如:typedef void (*FUNC)(int,int); FUNC pFun1,pFun2;等价于void (*pFun1)(int ,int);

define和typedef

梦想的初衷 提交于 2020-03-31 00:43:35
参考: 【C++】define 和typedef 的详细区别 define与typedef区别与联系 #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。 typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能,它是语言编译过程的一部分,但它并不实际分配内存空间。 一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。 typedef是语句( 以';'结尾),而#define不是语句( 不以';'结尾) typedef int * int_ptr; #define INT_PTR int * const int_ptr p; //p不可更改,但p指向的内容可更改 const INT_PTR p; //p可更改,但是p指向的内容不可更改 int_ptr是一种类型(类型本身就是整型指针),const int_ptr p就是把指针给锁住了p不可更改,而const INT_PTR p是const int * p锁的是指针p所指的对象。这些使用常常使我迷惑,所以搜集整理对他们的理解如下: #define的用法: 1、简单的宏定义 #define MAXTIME

46-把数字翻译成字符串

岁酱吖の 提交于 2020-03-30 23:53:23
面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi" 提示: 0 <= num < 231 class Solution { public int translateNum(int num) { String s = String.valueOf(num); int[] dp = new int[s.length() + 1]; dp[0] = 1; dp[1] = 1; for(int i = 2;i < s.length() + 1;i++){ dp[i] += dp[i - 1]; if(s.charAt(i - 2) != '0'){ int n = Integer.valueOf(s.substring(i - 2,i)); if(n >= 0 && n <= 25){ dp[i] += dp[i - 2]; } } } return dp[s.length()]; } } 来源: https://www

C - main函数

荒凉一梦 提交于 2020-03-30 17:05:24
mian函数 int main(int argv, char* argc[]){ printf("argv is %d \n",argv); int i; for(i=0; i<argv; i++){ printf("argc[%d] is %s \n",i,argc[i]); } return 0; } 1. 在命令行中运行.out文件    2. return 0在linux系统下表示程序执行成功 来源: https://www.cnblogs.com/xiaochengzi/p/11200362.html

指向函数的指针数组

拟墨画扇 提交于 2020-03-30 16:48:25
#include<iostream> using namespace std; int f1() { return 0; } int f2() { return 0; } int f3() { return 0; } int f4() { return 0; } int main() { int (*a[])()={&f1,&f2,&f3,&f4}; for(int i=0;i<4;++i) { a[i](); } } 应该注意的是这几个函数的参数必须一致,比如在这里都为空,同时返回值也必须是同一类型,如 上例返回值为void类型。 在弄清上面的问题的前提是必须清楚 指针函数和函数指针 的区别 指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 函数指针是指向函数的指针变量,即本质是一个指针变量。  int (*f) (int x); /* 声明一个函数指针 */  f=func; /* 将func函数的首地址赋给指针f */ 主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用。 来源: https://www.cnblogs.com/zhouyz/archive/2010/08/19/1803997.html

各类模板

☆樱花仙子☆ 提交于 2020-03-30 16:10:55
四边形不等式 定义函数 \(f(l,r)\) 满足四边形不等式为:对于所有 $ l \le l' \le r' \le r $ ,满足 $f(l,r) \ge f(l',r') , f(l,r)+f(l',r') \ge f(l,r')+f(l',r) $ 对于状态转移方程 $f(i,j)=min \begin{Bmatrix} f(i,k)+f(k+1,j) \end{Bmatrix}+w(i,j) | i<=k<j $ ,有如下结论: 若w满足四边形不等式,则f满足四边形不等式 设s(l,r)表示区间[l,r]取最优值时k的值则: \[s(l,r-1) \le s(l,r) \le s(l+1,r) \] 要点:整体不小于局部,包含不小于相交,长度减1求范围。 例子: P1880 [NOI1995]石子合并 代码: #include<cstdio> #include<algorithm> using namespace std; const int oo=1e9+7; const int maxn=2007; int a[maxn],sum[maxn]; int n,Fi[maxn][maxn],Fa[maxn][maxn],s[maxn][maxn]; int main() { #ifdef local freopen("pro.in","r",stdin); #endif

正确使用递归的思路

≡放荡痞女 提交于 2020-03-30 15:49:33
step1:明确我的函数想做什么:对于递归而言,最重要的莫过于搞清楚“这个函数的功能是什么”。它想要什么结果,完全是由我来定义。比如 //计算n的阶乘 int f(int n){ return 0; } 一个目的性的函数有了,接下来看第二要素 step2:学找递归结束的条件:在定义的函数代码中,调用自己本身,就是递归。因此,我们必须明确递归的结束条件,否则就会陷入“黑洞”中难以自拔。换句话说,也就是当参数满足什么条件时,递归结束,并把结果返回。此时,我们把要素2掺杂进我们刚刚定义好的函数内: //计算n的阶乘 int f(int n){ if (n==1){ return 1; } return 0; } step3:找出函数的等价关系式:精确缩小函数范围,从而的到准确结果。假如我们的等价关系式为f(n) =n*f(n-1): //计算n的阶乘 int f(int n){ if (n<=2){ return n; } return n*f(n-1); } 来源: https://www.cnblogs.com/starboy13/p/12598381.html

vector 容器

匆匆过客 提交于 2020-03-30 15:23:22
向量vector 可以理解为一个能存放任意类型的动态分配的数组。 这里展示一些常用的函数 加入头文件 #include <vector> 首先创建一个vector std::vector<int> v; 表示我要创建一个向量,这个向量名字叫v,存放的全都是int型的数据。 这里的 int 可以换成 string double float 等任意数据类型。 我们知道数组在定义的时候需要写明数组的容量。向量也可以这样做 std::vector<int> v(10); 表示我定义了一个名字叫 v 的向量,v里面有 10 个 int 型的数据。 也可以在定义的同时,就 初始化向量 的数据 std::vector<int> v(10,20); 表示我定义了一个含有10个元素 ,且每一个元素值都是 int 型的 20 的向量 名字叫 v。 元素的个数 std::vector<int>::size_type count = v.size(); 前面的 std::vector<int>::size_type 表示数据类型 可以理解为无符号整形 查看首位元素 v.front(); //返回首元素的值 v.back(); //返回尾元素的值 在向量的末尾添 加一个元素 30 v.push_back(30); 只能在末尾添加,添加之后向量的size就变化了 int main(int argc,char

hdu 1556 线段树

可紊 提交于 2020-03-30 12:08:31
这个题其实有O(n)的算法,不过还是用线段树做了一遍,还写了个自认为不错的pushalldown函数,哈哈。 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 100001; 7 int ans[N]; 8 9 struct Node 10 { 11 int l, r, add; 12 } node[N << 2]; 13 14 void build( int i, int l, int r ) 15 { 16 node[i].l = l, node[i].r = r, node[i].add = 0; 17 if ( l == r ) return ; 18 int lc = i << 1, rc = lc | 1, mid = ( l + r ) >> 1; 19 build( lc, l, mid ); 20 build( rc, mid + 1, r ); 21 } 22 23 void pushdown( int i ) 24 { 25 if ( node[i].add ) 26 { 27 int lc = i << 1, rc = lc | 1; 28 node[lc].add += node[i].add; 29