零、写在前面
今天是c语言基础打卡的第25天,今天我尝试使用markdown来编辑这些内容完善这部分的所有题解吧。
【第25题】求所有 1 到 5 的全排列 | 令人窒息的 for 循环
一、主要知识点
多层for循环
全排列的求法
求1-5的全排列
int h[6];
int main() {
int i, j, k, l, m;
for(i = 1; i <= N; ++i) {
h[i] = 1; //标记i
for(j = 1; j <= N; ++j) {
if(h[j]) continue; //判断是否重复
h[j] = 1;
for(k = 1; k <= N; ++k) {
if(h[k]) continue; //判断是否重复
h[k] = 1;
for(l = 1; l <= N; ++l) {
if(h[l]) continue; //判断是否重复
h[l] = 1;
for(m = 1; m <= N; ++m) {
if(h[m]) continue; //判断是否重复
printf("%d%d%d%d%d\n", i, j, k, l, m);
}
h[l] = 0; //还原
}
h[k] = 0; //还原
}
h[j] = 0; //还原
}
h[i] = 0; //还原
}
return 0;
}
二、课后习题
392. 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
解题思路
根据要求依次判断就好了,但是要注意边界情况。
bool isSubsequence(char * s, char * t){
if(!t[0]&&!s[0]) return true;//都是空串
else if(!t[0]) return false;//只有目标串是空串
int low = 0,high = 0;//开始对比
while(s[low]&&t[high]){
while(t[high]&&s[low] != t[high]) high++;//不同则继续往后找
if(!t[high]) return false;//high已经到末尾了 但是low还没
low++;high++;//两者同时往后走
}
if(!s[low]) return true;//low到末尾了说明匹配完结
return false;
}
240. 搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
解题思路
一开始的思路肯定是从右小角开始判断,但是能排除的情况会很复杂。
但是换一个思路,从右上角开始判断的话,每次都能消去一行或者一列。当超出表示范围的时候就说明没找到。
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
int row = matrixColSize[0] -1,col = 0;//查找的初始位置
while(row>=0 && col < matrixSize){
if(matrix[col][row] > target) row--;//大于 消去一列往左走
else if(matrix[col][row] < target) col++;//小于 消去一行往下走
else return true;
}
return false;
}
2006. 差的绝对值为 K 的数对数目
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。
|x| 的值定义为:
- 如果 x >= 0 ,那么值为 x 。
- 如果 x < 0 ,那么值为 -x 。
解题思路
简单的双循环。
int countKDifference(int* nums, int numsSize, int k){
int i,j,x;
int t = 0;
for(i=0;i<numsSize;i++)
{
for(j=i+1;j<numsSize;j++)
{
x=nums[i]-nums[j];
if(x>0) x=x; //取绝对值
else x=-x;
if(x==k) t++; //是否满足要求
}
}
return t;
}
写在最后
还是有些迷茫,最近也忙于考试,要死要死-.-