自除数判断,除自身以外数组乘积,[ ]操作符,二维数组内存存储计算,有关进制转换与取数字每一位的问题

news2024/11/18 11:29:58

tips

1. 表达式求值的时候,首先当然是从左往右看确定优先级(只针对相邻操作符才有意义),相邻操作符按照优先级高低计算,如果(相邻)操作符的优先级相同(也就是两个操作符一毛一样了),这时候结合性才起作用。N/A表示没有结合性,L-R表示从左向右结合,R-L表示从右向左结合。接下来就是是否控制求值顺序,一般的操作符都是否,但是也有个别操作符能够控制求值的顺序,比如说逻辑与,一旦左边发现有假,右边就不会执行下去;逻辑或,一旦发现左边有真,右边也不会执行下去。包括还有条件操作符,一样道理。

2. 

3. 优先级比较:( ) > [ ] > -> > ++ > -- > . > *

4. sizeof是一个操作符,不是一个函数,它算的是变量所占内存字节的大小,它后面括号里面的运算不影响数据变化(因为是在编译阶段完成的),它的返回类型是size_t,其实也就是unsigned int.

5. ++与--是有副作用的
6. 字符在代码里面其实就是一个ASCII码,因为编译器就是这么认为的。
7. 逗号表达式中的每一个表达是都会执行。因此会产生各自的效果,但是这个表达式的结果是最后一个表达式的结果。

8. 说起这个进制转换,我发现我还是要搞错。
     1. 如果你想要得到一个十进制整数n进制表达形式最后一位,就把该十进制数%n即可,如果你想要得到丢去最后一位的表达形式,就把这个十进制数/n
     2. 如果你想要得到一个十进制整数的n进制的每一位,就把这个十进制数%n,然后在/n去不断更新,并以此循环,当/n后发现为0时结束。

     3. 但是这种操作方法在求十进制整数的2进制表达形式时,如果碰到负数的话就会出问题,因此那个数的类型要改为unsigned int 这样的话,计算机里面存储的二进制补码仍然保持不变,但是对二进制的解读发生了变化,最高位不是符号位了。

自除数判断

题目链接:https://leetcode.cn/problems/self-dividing-numbers/ 

题目:

 

代码:

int* selfDividingNumbers(int left, int right, int* returnSize)
{
    static int arr[10000]={0};
    int i=0;
    int count=0;
    for (i=left;i<=right;i++)
    {
        int flag=0;
        int tmp=i;
        while(tmp)
        {
            int num=tmp%10;//最后一位
            tmp/=10;//更新
            if ((num==0)||(i%num!=0))
            {
                flag=1;
                continue;
            }
        } 
        if (flag==0)
        {
            arr[count++]=i;
        }
    }
    *returnSize=count;
    return arr;
}

经验总结:

1. 如果想要找到一个数n进制形式的每一位,就先把这个数%n,然后再/n更新,如此循环。
2. 如果想要得到一个数n进制形式下的最后一位,就把这个数%n,如果想要得到一个数除去最后一位的"那个数字形式",就把那个数/n。
3. static修饰变量,数组的意义就在把原先放在内存栈区的东西现在如果给它修饰了一下,那么它就放在静态区里面了。内存栈区里面的东西一旦进入作用域创建,出了作用域就会销毁,而静态区里面的东西都是全局的,直到程序结束之后才会被销毁。
4. 空指针的形成原因:没有初始化,越界访问,指针指向的空间被释放还给操作系统了
,像上面这道题话,如果没有在数组前面用static修饰,那么这个数组是创建在栈区上,当这个函数调用结束的时候,原先的数组内存空间就会被释放,这时候你返回的那个指针就是空指针了。

除自身以外数组的乘积 

题目链接:https://leetcode.cn/problems/product-of-array-except-self/

题目:

代码1:

int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
    static int answer[100000];
    int left[numsSize];
    left[0]=1;
    int right[numsSize];
    right[numsSize-1]=1;
    int i=0;
    for (i=1;i<numsSize;i++)
    {
        left[i]=left[i-1]*(*(nums+i-1));
    }
    for (i=numsSize-2;i>=0;i--)
    {
        right[i]=right[i+1]*(*(nums+i+1));
    }
    for (i=0;i<numsSize;i++)
    {
        answer[i]=left[i]*right[i];
    }
    *returnSize=numsSize;
    return answer;
}

经验总结:

1. 以此为界,左右分开,寻找联系这也是一种技巧。
2. 这道题要计算除该元素以外其他元素的乘积,我们就可以以该元素为界,把数组分成左右两部分。那么该数左边的乘积乘上右边的乘积就OK了。
3. 这时候在创建两个新的数组,一个数组用来放该数左边的乘积,另一个数组用来放该数右边的乘积。最后在每个元素相乘乘起来就OK了 

4. 然后就是很关键的一点,当你在算乘积的时候,别总是只会去一次又一次遍历,当多次连续计算乘积的时候,只需要在原来基础上乘1个数就完事了

代码2:

int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
    static int answer[100000];
    answer[0]=1;
    int i=0;
    for (i=1;i<numsSize;i++)
    {
        answer[i]=answer[i-1]*(*(nums+i-1));
    }
    int R=1;
    for (i=numsSize-1;i>=0;i--)
    {
        answer[i]=answer[i]*R;
        R*=(*(nums+i));
    }
    *returnSize=numsSize;
    return answer;
}
//或者这样
int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
    static int answer[100000];
    answer[0]=1;
    int i=0;
    for (i=1;i<numsSize;i++)
    {
        answer[i]=answer[i-1]*(*(nums+i-1));
    }
    int R=1;
    for (i=numsSize-2;i>=0;i--)
    {
        R*=(*(nums+i+1));
        answer[i]*=R;
    }
    *returnSize=numsSize;
    return answer;
}

经验总结:

1. 尽管上面的方法已经能够很好的去解决问题,但是还是可以进行简化。
2. 上面的方法是创建两个数组,分别用来放左侧元素的乘积与右侧元素的乘积。但是事实上,没有必要创建两个数组。可以直接把第二个数组当成输出数组。

 

3. 当其中一个数组计算完成之后,接下来可以一个元素一个元素边动态构造数组,边相当于把该数组渐渐变成输出结果数组。 

[ ]操作符

[ ]是一个操作符哦,我们经常在数组里面碰到过它,那么它是来干什么的呢?它的本质核心事实上是这样。
1. 这个操作符有两个操作数a,b 这两个操作数位置交换一下没有任何关系,OK的。
2.  注意:  

a [ b ] = b [ a ] = * (a+b) 

 

3. 这个操作符的结合性是从右往左,因此:

a [ b ] [ c ] =  * ( a [ b ] + c ) = * ( * ( a + b ) + c ) 

具体题目1:

 

答案:D

解析: 

具体题目2:

 

答案:B.C

解析:

二维数组内存存储的计算

题目: 

 

解析:

 

经验总结:

1. 一个字节、一个内存单元对应一个地址编号,00665544与00665548中间共有四个内存单元,也就是说四个字节。

2. 二维数组在内存当中其实也是线性存储的,这时候就用i来标记“行数”,j来标记“列数”。
3. 涉及到二维数组,有时候把它看成矩阵比较方便(但事实上根本就不是这样子存储数据的),有时候把它看成内存里面这么线性存储比较方便。
4. 每两个数减一下,算中间隔着几个数这个要会弄(有点弱智)

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136023.html

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

相关文章

4G低功耗摄像头模组如何快速唤醒拍照

对于应用在野外恶劣环境&#xff0c;无电无网络的情况下&#xff0c;需要一款能支持太阳能供电或者电池供电&#xff0c;不过前提是&#xff0c;功耗需要足够低&#xff0c;还需要能支持无线网络&#xff0c;能上传图片回到服务器&#xff0c;用于监测一些野外作业的数据&#…

Vue.set()的使用,以及对其进行深入解析

目录 Vue.set()使用 Vue.delete()的使用 Vue.set()方法原理解析 总结 Vue.set()使用 vue 在实例上添加新的属性的时候&#xff0c;该属性&#xff0c;并不是响应式的。同样删除某一属性的时候&#xff0c;也不会实时渲染到页面上。 比如&#xff1a; <p> 年龄&#x…

Python开发案例之用Python子进程关闭Excel自动化中的弹窗

利用Python进行Excel自动化操作的过程中&#xff0c;尤其是涉及VBA时&#xff0c;可能遇到消息框/弹窗&#xff08;MsgBox&#xff09;。此时需要人为响应&#xff0c;否则代码卡死直至超时 [^1] [^2]。根本的解决方法是VBA代码中不要出现类似弹窗&#xff0c;但有时我们无权修…

在专网建设场景,LoRa和NB的技术优劣对比

先说结论&#xff1a;运营商在大铺NB&#xff0c;LoRa更适用于专网。 对于某个企业或者组织的实际应用来说&#xff0c;最后很可能是nb做骨架&#xff0c;lora做补充&#xff0c;混合应用。除非是nb在覆盖继续完善做到无死角 其实&#xff0c;对于物联网复杂的应用场景来说&am…

国产的内网穿透工具也很优秀,这10款工具推荐正在寻找的你!

什么是内网穿透&#xff1f; 首先&#xff0c;我们生活中的网络从应用上可以分为内网和外网&#xff1b; 内网就是你自己的网络环境&#xff0c;就你自己能访问&#xff0c;比如你本地测试进行的localhost&#xff1b; 外网就不言而喻了&#xff0c;你看网页&#xff0c;视频…

利用vite创建vue3工程

目录 什么是vite 优势&#xff1a; 简单理解&#xff1a; 1、创建工程 2、进入工程目录&#xff0c;安装依赖 3、启动​编辑 什么是vite 官方创建的前端构建工具 优势&#xff1a; 1开发环境中&#xff0c;无需打包操作&#xff0c;可快速冷启动 2轻量快速的热重载 3真…

Word文件加密的方法有哪些?两种方法告诉你

日常生活工作中&#xff0c;我们经常会使用到Word文档。有时里面有些比较重要的内容&#xff0c;我们不想别人随便可以更改我们输入的内容、窥探我们的隐私&#xff0c;我们该怎么做&#xff1f;建议给你的word文件加密&#xff0c;这样就能更好保护我们的信息。 操作环境&…

C语言论坛系统[2023-01-03]

C语言论坛系统[2023-01-03] 论坛系统设计 课程说明 需要提交的内容包括两个部分。 第一部分&#xff0c;对代码功能的讲解。 课设要求最后每个同学录制一个讲解视频&#xff0c;对着自己代码的功能进行讲解。 讲解时&#xff0c;主要涉及一个几个标准步骤&#xff1a; 步骤一…

【实操篇】Linux定时任务调度

目录 ●crond任务调度 简要介绍 基本语法 常用选项 参数细节说明 典型案例 应用实例 ●crond任务调度 简要介绍&#xff1a; 任务调度&#xff0c;它是指系统在某个特定时间去执行的特定命令或程序。它分为两类&#xff0c;第一类为系统工作&#xff08;一些周…

自动驾驶数据集(一):KITTI数据集介绍

如有错误&#xff0c;恳请指出。 文章目录0. 数据集下载1. 标注数据label_22. 校准数据calib3. 点云数据velodyne4. 图像数据image_20. 数据集下载 KITTI数据集的下载地址&#xff1a;https://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark3d&#xff0c;下载…

redis集群简介

集群的概念 所谓的集群&#xff0c;就是通过添加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态。 1.1.1 使用redis集群的必要性 问题&#xff1a;我们已经部署好了redis&#xff0c;并且能启动一个redis&#xff0c;实现数据的读写…

鸿蒙 HDF 框架介绍

鸿蒙 HDF 框架介绍鸿蒙 HDF 框架介绍HDF 驱动框架框图HDF 驱动框架工作原理HDF 驱动框架工作原理框图&#xff1a;HDF 驱动加载过程分析HDF 驱动加载过程分析——驱动实现1HDF 驱动加载过程分析——驱动实现2HDF 驱动加载过程分析——获取驱动列表HDF 驱动加载过程分析——获取…

buu刷题记录

[ACTF新生赛2020]crypto-aes from Cryptodome.Cipher import AES import os import gmpy2 from flag import FLAG from Cryptodome.Util.number import *def main():keyos.urandom(2)*16ivos.urandom(16)print(bytes_to_long(key)^bytes_to_long(iv))aesAES.new(key,AES.MODE_…

第五章. 可视化数据分析图表—综合应用(双y轴,堆叠柱形图,颜色渐变饼形图,等高线图)

第五章. 可视化数据分析图 5.7 综合应用 1.双Y轴可视化数据分析图表的实现 &#xff08;柱形图折线图&#xff09; 双y轴&#xff0c;顾名思义就是两个y轴&#xff0c;可以通过双y轴看出发展情况的同时&#xff0c;还可以看到正常速度。 1).注意&#xff1a; add_subplot一定要…

【自学Python】Python2代码转Python3代码

Python2代码转Python3代码 Python2代码转Python3代码教程 由于 Python 存在 Python2 和 Python3 两个主要的版本方向&#xff0c;经常会有将 Python2 的代码转到 Python3 的环境下运行的需求。 尤其是跑一些神经网络的代码时有很多是在 Python2 的环境下写的。在 Python3 下…

EXCEL的查找:如何按 行号+列号 进行查询

0 首先用match()等取得行号&#xff0c;列号 如果想根据行号列号&#xff0c;精确查找&#xff0c;另外一个区域的数据&#xff0c;可以用如下方法 INDIRECT("Sheet2!r"&MATCH($C11,Sheet2!$A:$A,0)&"C"&MATCH(D$10,Sheet2!$1:$1,0),FALSE) …

使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus)

vite官网 一&#xff1a;初始化项目 1.需要在创建项目的位置cmd目录下执行 2. npm init vitelatest 回车 npm init vitelatest3.填上自己的项目名称 回车 4.选择vue 回车 5.选择TypeScript回车 6.项目创建完成 或者一步到位通过附加的命令行选项直接指定项目名称和你想要使用的…

网络流量监控为某图书馆系统排忧解难(一)

前言 某学校图书馆信息中心老师反应&#xff0c;用户反馈系统有访问慢的情况&#xff0c;需要通过流量分析系统来了解图书馆系统的运行情况&#xff0c;此报告专门针对图书馆系统的性能数据做了分析。 信息中心已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实…

PB数据库开发技术(七)-PowerBuilder小型数据库应用系统开发

PowerBuilder小型数据库应用系统开发 实验目的 利用前面学过的知识设计一个“图书馆管理系统”,从而进一步掌握powerbuilder数据库开发的基本步骤和方法。 二.实验步骤 建立数据库“图书管理系统”,向数据库中添加操作员表、借书还书表、图书表以及相应数据

Unity 项目中怎样正确的使用 Lua?

&#xff08;图源siki学院-狸墨老师&#xff09; 什么是Lua Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。可以方便的与c/c进行相互调用。但…