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

news2024/11/17 17:47: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.coloradmin.cn/o/148631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【案例教程】CLUE模型构建方法、模型验证及土地利用变化情景预测实践技术

【前沿】&#xff1a;土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译&#xff0c;可获取历史或当前任何一个区域的土地利用/土地覆盖数据&#xff0c;用于评估区域的生态环境变化、评价重大生态工程建设成效等。借助CLUE模型&…

声音产生感知简记

声音产生 人的发音器官包括:肺、气管、声带、喉、咽、鼻腔、口腔、唇。肺部产生的气流冲击声带,产生震动。 声带每开启和闭合一次的时间是基音周期(Pitch period,T),其到数为基音频率(F.=1/T,基频),范围在70-450Hz。基频越高,声音越尖细,如小孩的声音比大人尖,就是…

编译错误2

本文迁移自本人网易博客&#xff0c;写于2015年11月25日&#xff0c;编译错误2 - lysygyy的日志 - 网易博客 (163.com)1、error C2059:语法错误&#xff1a;“<L_TYPE_RAW>”error C2238:意外的标记位于“;”之前.错误代码定位于&#xff1a;BOOL TreeView_GetCheckState…

excel函数公式:常用高频公式应用总结 上篇

公式1&#xff1a;条件计数条件计数在Excel的应用中十分常见&#xff0c;例如统计人员名单中的女性人数&#xff0c;就是条件计数的典型代表。条件计数需要用到COUNTIF函数&#xff0c;函数结构为COUNTIF(统计区域,条件)&#xff0c;在本例第一个公式COUNTIF(B:B,G2)中&#xf…

《栈~~队列~~优先级队列》

目录 前言&#xff1a; 1.stack 1.stack的介绍 2.stack的使用&#xff1a; 3.stack的模拟实现 4.有关stack的oj笔试题 2.queue 1.队列的介绍 2.队列的使用 3.队列的模拟实现 4.有关队列的oj笔试题 3.priority_queue 1.优先级队列的介绍 2.优先级队列的使用 3.优先级队列的模拟实…

挥别2022,坦迎2023。

第一章&#xff1a;CSDN&#xff0c;我来啦&#xff01;第一节&#xff1a;初遇&#xff01;2022-08-13&#xff0c;我和CSDN相遇啦&#xff01;CSDN&#xff0c;你好呀&#xff01;2022年8月13日&#xff0c;是我与你相遇的日子。这是一个值得纪念的时刻。从此之后&#xff0c…

English Learning - L1-10 时态(下) 2023.1.5 周四

English Learning - L1-10 时态&#xff08;下&#xff09; 2023.1.5 周四8 时态8.3 完成时态核心思想&#xff1a;回首往事&#xff08;一&#xff09;现在完成时核心思想用法延续动作延续时间 “动作一直持续了。。。”延续动&#xff08;无延续时间&#xff09; “做过。。…

AtCoder Beginner Contest 284 A - E

题目地址&#xff1a;AtCoder Beginner Contest 284 - AtCoder 一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.8 Last edited: 2023.1.8 目录 题目地址&#xff1a;AtCoder Beginner C…

基于FPGA的UDP 通信(一)

引言手头的FPGA开发板上有一个千兆网口&#xff0c;最近准备做一下以太网通信的内容。本文先介绍基本的理论知识。FPGA芯片型号&#xff1a;xc7a35tfgg484-2网口芯片&#xff08;PHY&#xff09;&#xff1a;RTL8211网络接口&#xff1a;RJ45简述以太网什么以太网&#xff1f;以…

k8s之实战小栗子

写在前面 本文一起看一个基于k8s的实战小栗子&#xff0c;在这篇文章 中我们基于docker搭建了一个WordPress网站。本文就通过k8s再来实现一遍。架构图如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/9c73ac0c183a429a8f4b1a2feb363527.png 从上图可以…

使用Origin计算数据的上升\下降时间

使用Origin计算上升/下降时间计算上升时间1导入数据&#xff0c;做图2、选择合适的数据范围3、选择上升时间和上升范围两个测量参数&#xff0c;获得结果4、更改区间&#xff0c;并导出数据计算下降时间1、将感兴趣区域移动到下降沿2、更改为测量下降沿参数获得结果上升时间小工…

【Kotlin】空安全 ④ ( 手动空安全管理 | 空合并操作符 ?: | 空合并操作符与 let 函数结合使用 )

文章目录一、空合并操作符 ?:二、空合并操作符与 let 函数结合使用一、空合并操作符 ?: 空合并操作符 ?: 用法 : 表达式 A ?: 表达式 B如果 表达式 A 的值 不为 null , 则 整个表达式的值 就是 表达式 A 的值 ; 如果 表达式 A 的值 为 null , 则 整个表达式的值 就是 表达…

vue-路由的使用方式

1.下载路由 使用npm的下载: # vue2对应版本 npm i vue-router3# vue3对应版本 npm i vue-router42.路由初试化 路由的三种模式: history, 指定路由的模式, 有hash,history,memory三种模式,一般使用第一种和第三种模式 createWebHashHistory hash模式 > http://localhost…

十大字符串函数与内存操作函数

前言&#xff1a;我们知道在C语言的库中有许许多多的库函数&#xff0c;今天我就来介绍一下自己对两大类库函数中一些常用函数的认识和理解&#xff0c;希望对大家有帮助。 说明&#xff1a;下文中会花较大篇幅实现这些库函数的模拟&#xff0c;请大家不要觉得库函数直接用就好…

UNet入门总结

作者&#xff1a;AI浩 来源&#xff1a;投稿 编辑&#xff1a;学姐 Unet已经是非常老的分割模型了&#xff0c;是2015年《U-Net: Convolutional Networks for Biomedical Image Segmentation》提出的模型。 论文连接&#xff1a;https://arxiv.org/abs/1505.04597 在Unet之前…

Android 深入系统完全讲解(4)

4 SystemServer 创建过程 SystemServer 进程非常关键了&#xff0c;我们上层的服务都是在这里以线程的形式存在&#xff0c;比如 AMS&#xff0c;PMS&#xff0c;WindowManagerService&#xff0c;壁纸服务&#xff0c;而关于调试这个服务进程&#xff0c;我们随后就会讲到。 …

虚拟人-面部表情-Audio2Face语音驱动表情

任务&#xff1a; 输入自己的音频&#xff0c;导入maya模型&#xff0c;让maya模型通过音频驱动说话 教程&#xff1a; https://www.bilibili.com/video/BV1rZ4y1R7H4/?p2&spm_id_frompageDriver&vd_sourceef114f70c3fd4d5394f12dbd3d022bbe 一.下载和安装 1.首先…

Java面试常见问题-SE篇

JavaSE面试问题汇总①int和Integer的区别为什么设计封装类型&#xff1f;JDK、JRE、JVM的区别和equals方法的区别hashCode()与equals()之间的关系泛型中extends和super的区别String、StringBuffer、StringBuilder的区别重载和重写的区别接口和抽象类的区别List与Set的区别Array…

2023/1/8总结

今天学了了强连通算法 Tarjan算法 Tarjan算法是一种求解有向图强连通分量的线性时间的算法&#xff0c;他运用到了DFS算法以及DFS的特性和数据结构——栈。 算法介绍&#xff1a;如果两个顶点可以相互通达&#xff0c;则称两个顶点强连通(strongly connected)。如果有向图G…

LeetCode题解 二叉树(十三):701 二叉搜索树的插入操作;450 删除二叉搜索树中的结点

701 二叉搜索树的插入操作 medium 给定二叉搜索树&#xff08;BST&#xff09;的根节点和要插入树中的值&#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证&#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 如果要按照题目中所说改变二叉…