[C语言]经典例题之一求最大值

简介

  本文将介绍一个在c语言学习过程中非常简单且非常经典的问题,以及介绍大多数人在写这个代码时经常会跳进去的一个坑。

正文

  求最大值基本每个人都会,所以简单叙述一下要点:创建一个数组以及创建一个变量max,给变量max赋值然后跟数组中每个元素一 一进行判断,如果数组中的数比max大那么把这个数赋给max,以此类推;
  看起来非常简单,那么我们实现一下(代码如下):

#include<stdio.h>
int main()
{
 int i = 0;
 int arr[10] = {0};
 int max = 0;//定义变量max用来作比较
 printf("请输入十个整数:\n");
 for(i=0; i<10; i++)
 {
  scanf("%d",&arr[i]);
 }
 for(i=0; i<10; i++)
 {
  if(max < arr[i])
   max = arr[i];
 }
 printf("最大值为%d\n",max);
 return 0;
}

  这个代码看起来毫无问题,附上运行结果如下:
在这里插入图片描述
结果看起来没毛病,试一试负数:

bug出来了,为什么会出现这种情况呢?
  代码看起来似乎无懈可击,但是运行结果却是错的,回过头看代码,为什么会给max赋值0呢?这样是不是就是默认比较变量最大值是0了,那么输入负数时就会出现毛病,所以应该给max赋一个数组中的值。修改后的代码如下:

#include<stdio.h>
int main()
{
 int i = 0;
 int arr[10] = {0};
 int max = 0;
 printf("请输入十个整数:\n");
 for(i=0; i<10; i++)
 {
  scanf("%d",&arr[i]);
 }
 max = arr[0];
 for(i=1; i<10; i++)
 {
  if(max < arr[i])
   max = arr[i];
 }
 printf("最大值为%d\n",max);
 return 0;
}

  这样就可以了,给max赋数组中第一个值,然后一 一与数组中的值进行比较(max可以赋予数组中任何一个值),这里还有一个优化,因为我们赋的值是第一个,那么循环就可以从数组中第二个元素开始,所以for循环i从1开始循环。结果如下:
在这里插入图片描述
这样就可以处理当输入的数据为负数的情况了。

总结

  本文演示了求数组中最大值的问题,以及演示了很容易跳进的一个坑。


ps: 有不当之处希望大家提出批评并指正。


缓存是一个高频出现在技术面试中的主题,尤其是在后端开发和系统设计相关的岗位中。以下是关于缓存的一些常见知识点以及可能的面试题目解析。 --- ### **一、为什么需要缓存?** 1. 提升性能:减少数据库访问次数,降低延迟; 2. 减轻服务器压力:通过存储频繁请的数据,避免每次都要重新生成内容; 3. 改善用户体验:更快响应用户操作。 注意,在引入缓存的同时也要考虑一致性问题(即如何保证缓存数据与实际数据同步更新)和其他潜在挑战如内存占用等问题。 --- ### **二、常用的分布式缓存有哪些?** - Redis - 特点: 内存级速度读写,支持多种数据结构(字符串,string;哈希hashes;列表lists等等). - 应用场景: 会话管理(session store),排行榜,top N统计等. - Memcached - 特点: 更加注重于简单的key-value形式的高速缓存服务。 - 应用场景: 页面静态化,图片缩略图处理等领域比较适合memcache的应用. 两者对比来看,redis功能更为强大丰富并且具备持久化的特性而memcached则更关注纯粹的速度优化上. --- ### **三、LRU算法是什么?怎么实现它的?** #### 定义: Least Recently Used(LRU)是最少最近使用的页面淘汰策略的一种。当物理内存块已被占满时,优先替换掉那些最长时间未被访问过的页框. #### Python伪代码实现: ```python from collections import OrderedDict class LRUCache: def __init__(self, capacity): self.cache = OrderedDict() self.capacity = capacity # get method to retrieve item def get(self,key): if key not in self.cache: return -1 else: value = self.cache.pop(key) self.cache[key] = value # move this pair to end (most recently used position) return value # put method for inserting items into cache def set(self, key,value): if key in self.cache: self.cache.pop(key) elif len(self.cache)>=self.capacity: self.cache.popitem(last=False)# remove first added element i.e least recently used one self.cache[key]=value # insert new entry at the last location indicating most recent usage ``` 此段程序展示了如何利用OrderedDict这个特殊的字典类型来轻松构建我们的LRU Cache。每当某个键值对被获取或插入的时候都会将其移到队列最后面代表它是刚被使用的;一旦达到设定的最大容量,则自动删除最早添加的那个元素也就是那个很久都没再用到的东西啦! --- ### 四、缓存穿透的问题及解决方案? 所谓"缓存穿透",就是指查询一个既不在缓存也不在DB里的记录的现象发生时候造成的浪费资源的情况。这种情况可能导致严重的后果:如果攻击者故意构造大量不存在的关键字进行检索就会导致后台不断尝试去查找根本就不存在的内容从而带来巨大负载甚至崩溃的风险。所以我们一般采取以下措施预防这样的事情的发生: 1. 布隆过滤器(Bloom Filter) :预先判断某条数据是否存在后再决定是否进入下一层搜索过程,有效阻挡恶意请带来的威胁; 2. 设置空结果缓存 : 对查无此项也给予一定时间的有效期然后放入Redis之类的工具里边暂存起来防止短时间内反复询问相同的缺失资料造成不必要的麻烦; 3. 接口限流 : 控制单位时间内允许提交过来的数量以保障系统的稳定性不受外界干扰因素的影响过大.
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值