位运算做加法,桶排序找消失元素,名次与真假表示,杨氏矩阵,字符串左旋(外加两道智力题)

news/2024/11/7 8:35:36/

Tips

1. 

2.  

3. 大小端字节序存储这种顺序只有在放进去暂时存储的时候是这样的,但是一旦我里面的数据需要参与什么运算之类的,会“拿出来”恢复到原先的位置再参与运算,因此,大小端字节序存储的什么顺序不影响移位运算等等,

    1. 移位运算,二进制加减等等的话数字二进制补码形式仍然按照正常的逻辑顺序

    2. 指针解引用的话会受到影响的

  

4. 大小端字节序指的是数据在电脑上存储的二进制位顺序,错误;大小端字节序指的是数据在电脑上存储的字节顺序,正确。是以字节为基本单位,字节里面就是天生反骨

5. 字符串常量就是该字符串首字符的地址,字符串的每个字符也都是线性存放的

6. 数组指针是一种存放数组的指针,错误!指针是用来存放地址的,存放数组是什么玩意,数组指针是指向数组,里面存放着数组的地址

7. 变量名p与[ ]结合在一起,那么p就是数组,如果与*结合,那么p就是指针

8. 如果一个等号两边是指针,但是指针类型不一样,这时候就不兼容了会报警告,但是垃圾桶瞎子void*除外,但是如果你硬要无视警告这么去弄,那也没办法,这时候就相当于是对等号右边指针进行了强制类型转化成等号左边的类型,比如说int* p=&arr,那么好了,&arr本来是数组指针类型,不过你得按照int*指针类型的规则来

9.  arr做为二维数组的数组名=二维数组首元素的地址=二维数组的第一行的地址=二维数组的第一个一维数组的地址=因此是一个指向数组的指针,指针类型比如说为:int(*)[10]这样子

10.  .除了sizeof(arr)和&arr中的数组名,其他地方出现的数组名arr,都是数组首元素的地址。

11,函数名就是函数的地址,数组名就是数组首元素的地址

12. 在创建函数指针时,一般都是int(*p)(int,char) 这样,但是如int(*p)(int n, char m)这样子也是可以的

13. 如果是n个元素的数组,然后你去遍历这个数组去找数字,最坏的情况是需要去找n次,所以称时间复杂度为O(N)。时间复杂度讨论这个算法在最坏的情况下的数量级

用加减乘除号做加法(位运算)

题目链接:https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=23249&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking题目:


 

代码:

 * @param num1 int整型 * @param num2 int整型 * @return int整型*/
int Add(int num1, int num2 ) 
{int add1=num1;//add1进位制int add2=num2;//add2是未考虑进位的和while(add1){add1=(num1&num2)<<1;add2=num1^num2;num1=add1;num2=add2;}return add2;
}

经验总结与解析:

1.  

2. 两数相加的和=未考虑进位的和与进位制,而按位异或按位与再左移一位恰好能够表示这两个

找到所有数组中消失的元素

题目链接:https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/ 

题目:

 代码:

int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{int arr[100000]={0};static int arr1[100000]={0};int k=0;int i=0;for (i=0;i<numsSize;i++){arr[*(nums+i)]=1;}for (i=1;i<=numsSize;i++){if (arr[i]==0){arr1[k++]=i;}}*returnSize=k;return arr1;
}

经验总结:

1, 利用桶排序思想的去重原理 

猜名次 

题目:

 

代码:

#include <stdio.h>
int main()
{int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;for (a = 1; a <= 5; a++){for (b = 1; b <= 5; b++){for (c = 1; c <= 5; c++){for (d = 1; d <= 5; d++){for (e = 1; e <= 5; e++){if (((b == 2) + (a == 3) == 1) &&((b == 2) + (e == 4) == 1) &&((c == 1) + (d == 2) == 1) &&((d == 3) + (c == 5) == 1) &&((e == 4) + (a == 1) == 1)){if (a * b * c * d * e == 120){printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);}}}}}}}return 0;
}

经验总结:
1. 如何将描述转化为编程语言,怎么将现实问题代码的思路

2. 比如说:

    1. 名次怎么表述?我可以a==3来表述

    2. 一个人只说对一半怎么表述?我可以用两个逻辑表达式加起来等于1来表述

    3. 枚举怎么表述?我可以用for循环

猜凶手 

题目:
 

代码:

//低级
int main()
{int arr[4] = { 0 };char arr1[4] = { 'a','b','c','d' };int i = 0;for (i = 0; i < 4; i++){arr[i] = 1;if ((arr[0] == 0) + (arr[2] == 1) + (arr[3] == 1) + (arr[3] == 0) == 3){printf("%c", arr1[i]);}arr[i] = 0;}return 0;
}
int main()
{char killer = 'a';for (killer = 'a'; killer <= 'd'; killer++){if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3){printf("%c\n", killer);}}return 0;
}

经验总结:
1. 利用好逻辑表达式如果为真,值为1,如果为假哎,值为0

2. 字符的话其实在电脑里面也就是数值罢了,并且大小写字母之间的ASCII码是连续的 

赛马确定名次(智力题)

题目 :现有36匹马,以及六条跑道,但我没有计时器,我需要比较多少次才能够确定前三名

答案:8次

解析:

烧香问题(智力题) 

题目:现在有两根香,并且材质不均匀,但是每一根香燃烧完都需要1小时,请确定一个15分钟的时间段

解析:

杨氏矩阵

代码: 

int find_num(int arr[5][5], int* r, int* c, int num)
{int x = 0;int y = *c - 1;while ((x <= *r - 1) && (y >= 0)){if (num == arr[x][y]){*r = x;*c = y;return 1;}else if (num < arr[x][y]){y -= 1;}else{x += 1;}}return 0;
}
int main()
{int arr[5][5] = { {1,2,3,4,5} ,{2,3,4,5,6} ,{3,4,5,6,7}, {4,5,6,7,8}, {5,6,7,8,9} };int num = 0;while (scanf("%d", &num) != EOF){int x = 5;int y = 5;if (find_num(arr, &x, &y, num)){printf("找到了,下标为:%d %d\n",x,y);}else{printf("找不到\n");}}return 0;
}

经验总结: 

1. 二维数组传参的时候有必要把行数与列数也传参过去,因为实参为数组名的话只表示数组首元素的地址

2. 有时候如果你想要返回两个值,但是return的话只能返回一个值,这时候就传址调用,然后把要返回的东西直接在函数内通过解引用操作放到内存里面

3.  

字符串左旋

题目:
 

代码1:

#include <string.h>
void left_move(char arr[], int n)
{int sz = strlen(arr);int i = 0;n %= sz;for (i = 0; i < n; i++){char tmp = arr[0];int j = 0;for (j = 0; j < sz - 1; j++){arr[j] = arr[j + 1];}arr[sz - 1] = tmp;}
}
int main()
{char arr[] = "abcdef";int n = 0;scanf("%d", &n);left_move(arr, n);printf("%s\n", arr);return 0;
}

经验总结:

1. 左旋n个字符本质上就可以看出是n个循环,每次循环左旋一个字符

2. 当左旋次数大于字符串字符个数时, 后面事实上就是对之前的重复,因此不需要重新计算。

代码2:

#include <string.h>
#include <assert.h>
void reverse(char* p1, char* p2)
{assert(p1 && p2);while (p1 < p2){char tmp = *p1;*p1 = *p2;*p2 = tmp;p1++;p2--;}
}
void left_move(char arr[], int n)
{int sz = strlen(arr);n %= sz;reverse(arr, arr + sz - 1);reverse(arr, arr + sz - n - 1);reverse(arr + sz - n, arr + sz - 1);
}
int main()
{char arr[] = "abcdef";int n = 0;scanf("%d", &n);left_move(arr, n);printf("%s\n", arr);return 0;
}

经验总结:

1.  

2. 对于数组的分块思考(A/B)

3. 字符串操作时进行逆序排列技巧解题,有时候不仅仅时整体逆序一下那么直白简单,而是参杂着继续对字符数组的部分进行逆序

4. 传参传指针的时候最好断言一下。

 


http://www.ppmy.cn/news/10356.html

相关文章

基于融合SPD+BIFPN+CBAM改进YOLOv5的奶牛检测识别分析系统开发

在我之前的几篇文章中分别应用了不同的tricks来改进yolov5模型如下&#xff1a;加入针对小目标的SPD-Conv模块《yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别》加入BIFPN特征融合模块《基于yolov5sbifpn实践隧道裂缝裂痕检测》加入注意力机制模…

Go第 12 章 :1-家庭收支记账软件项目

Go第 12 章 &#xff1a;1-家庭收支记账软件项目 12.1 项目开发流程说明 12.2 项目需求说明 模拟实现基于文本界面的《家庭记账软件》该软件能够记录家庭的收入、支出&#xff0c;并能够打印收支明细表 12.3 项目的界面 12.4 项目代码实现 12.4.1 实现基本功能(先使用面向过…

声学特征提取普及笔记

声学特征如何提取? 一、声学特征预处理 首先进行预处理,就是我们最后要提取一帧一帧的这种声学特征,这个语音信号经过预处理然后提取特征,那么特征也有用原始的傅里叶变换,STFT短时傅里叶变换得到这个语谱图特征,也有用FBANK就没有滤波器的输出,还有用MFCC。预处理包括…

Java--经典五道练习题(较难)

文章目录 一、转换罗马数字 二、调整字符串 三、键盘输入任意字符串&#xff0c;打乱里面的内容 四、生成验证码 五、返回两数乘积 一、转换罗马数字 键盘录入一个字符串&#xff0c; 要求1&#xff1a;长度为小于等于9 要求2&#xff1a;只能是数字 将内容变成罗马数…

部署Web项目 (Linux)

部署Web项目 -- Linux一、Linux 环境搭建二、Linux 常用命令三、搭建 Java 部署环境3.1 JDK3.2 Tomcat3.3 MySQL四、部署 Web 项目4.1 什么是部署4.2 数据库建表4.3 构建项目并打包4.4 拷贝到 Tomcat 中4.5 验证一、Linux 环境搭建 这里我们使用的方法是购买云服务器 (CentOS …

数字验证学习笔记——SystemVerilog芯片验证23 ——数据采样

一、数据采样 当你coverpoint指定采样一个变量或表达式时&#xff0c;SV会创建很多“仓&#xff08;bin&#xff09;”来记录每个数值被捕捉到的次数。这些bin是衡量功能覆盖率的基本单位。covergroup中可以定义多个coverpoint&#xff0c;coverpoint中可以自定义多个cover bi…

Linux环境基础开发工具使用

文章目录&#xff1a;Linux软件包管理器 - yumLinux下安装软件的三种方式Linux中的yum查看软件包如何安装和卸载软件rz/sz - Windows机器和远端Linux机器的文件互传Linux编辑器 - vimvim基本概念vim的基本操作及命令vim底行模式命令集Linux编译器 - gcc/g使用gcc选项函数库静态…

禅道的部署与使用

文章目录1、禅道介绍2、下载安装3、使用3.1、创建项目3.2、添加用户3.3、团队管理3.4、测试人员提Bug3.5、开发人员修复Bug4、总结1、禅道介绍 官网地址&#xff1a;https://www.zentao.net禅道是专业的研发项目管理软件&#xff0c;有如下特点&#xff1a; 细分需求、任务、缺…