华为OD机考 2025C卷 - 对称美学 (C++ & Python & JAVA & JS & GO)
无限码力
华为OD机试真题刷题笔记华为od华为OD机试2025C卷华为OD2025C卷华为OD机考2025C卷
对称美学华为OD机试真题目录点击查看:华为OD机试2025C卷真题题库目录|机考题库+算法考点详解华为OD机试2025C卷100分题型题目描述对称就是最大的美学,现有一道关于对称字符串的美学。已知:第1个字符串:R第2个字符串:BR第3个字符串:RBBR第4个字符串:BRRBRBBR第5个字符串:RBBRBRRBBRRBRBBR相信你已经发现规律了,没错!就是第i个字符串=第i-1号字符串取反+第
Java | Leetcode Java题解之第338题比特位计数
m0_57195758
分享JavaLeetcode题解
题目:题解:classSolution{publicint[]countBits(intn){int[]bits=newint[n+1];for(inti=1;i<=n;i++){bits[i]=bits[i&(i-1)]+1;}returnbits;}}
用C程序编写一个程序,用数字打印出镜像的直角三角形图案
一、问题分析需要打印一个10行的数字金字塔,具有以下特征:右对齐结构每行包含:递减的空格数量(实现右对齐)递增的数字序列(从1开始到当前行号)二、关键规律行号(i):1~10空格数量=10-i第1行:9空格(10-1)第2行:8空格(10-2)…第10行:0空格数字部分=1到i的连续数字第1行:1第2行:12…第10行:12345678910三、代码实现解析#includeintmain(){in
3201. 找出有效子序列的最大长度 I
咔咔咔的
c++
3201.找出有效子序列的最大长度I题目链接:3201.找出有效子序列的最大长度I代码如下:classSolution{public:intmaximumLength(vector&nums){intres=0;vector>f(2,vector(2));for(intx:nums){x%=2;for(inty=0;y<2;y++){f[y][x]=f[x][y]+1;res=max(res,f[
010_赋值运算符(= / -= / += / *= / /= / %=)
HuCiZhi
JavaWebjavaweb
一、赋值运算符概述赋值运算符用于将右侧的值赋给左侧的变量,是Java中最基础也最常用的运算符之一。根据功能可分为两类:基本赋值运算符:=(单一赋值)复合赋值运算符:+=、-=、*=、/=等(运算+赋值结合)赋值运算符的优先级较低,通常在其他运算完成后执行,结合性为从右到左。二、基本赋值运算符(=)2.1功能与语法=用于将右侧表达式的值赋给左侧的变量,语法:变量=表达式;2.2示例//基本类型赋值i
【I3D 2024】Deblur-GS: 3D Gaussian Splatting from Camera Motion Blurred Images
__星辰大海__
论文阅读计算机视觉算法人工智能
文章目录1.李群与李代数2.相机运动模糊建模3.相机运动轨迹近似3.1.线性插值3.2.三次样条插值3.3.K阶贝塞尔曲线插值1.李群与李代数参考博客:视觉SLAM十四讲-李群与李代数。2.相机运动模糊建模运动模糊产生的原因是:相机在曝光期间捕捉到了移动的物体或自身发生了移动,导致场景中某些像素在成像过程中不是来自单一点,而是多个位置的光线的混合。假设在时间[t0,t0+T][t_0,t_0+T]
leetcode_121. 买卖股票的最佳时机
Ethan_.
leetcode面试题150算法leetcode算法
leetcode_121.买卖股票的最佳时机leetcode链接给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。示例1:输入:[7,1,5,3,6,4]输出:5解释:在第2天(股
InfluxDB 数据模型:桶、测量、标签与字段详解(二)
计算机毕设定制辅导-无忧
#InfluxDBdb
四、各组件在实际应用中的协作4.1数据写入过程以服务器性能监控场景为例,假设我们有一个包含多台服务器的集群,需要实时监控每台服务器的CPU使用率、内存使用率和磁盘I/O等性能指标。我们使用InfluxDB来存储这些监控数据,下面详细介绍数据写入过程。首先,确定数据存储的桶。我们创建一个名为“server_monitoring_bucket”的桶,专门用于存储服务器监控相关的数据。这个桶将作为所有服
Linux磁盘分区、挂载、LV扩容
EllisonPei
title:2020-10-13-Linux磁盘分区、挂载、LV扩容date:2020-10-1311:20:20categories:[linux]tags:[linux分区扩容]toc:trueLinux磁盘分区、磁盘格式化、挂载磁盘也可以参考博客:https://www.jianshu.com/p/63516e8de27d系统centos7.6磁盘分区先执行fdisk-l查看未分区的磁盘,i
2022-07-08 linux中文件名带?号的解决方案
白告2333
windows中写了一个shell脚本批量mv改名,导致文件名结尾出现??ls-b显现原形rename方法失败循环+mv方法可用foriin*.log?;doi=${i%.log?}echo$imv${i}.log?${i}.logdone成功
第31次一周小结(2023.02.19-02.25) 2023.02.26
龚宇佳
上周总结:1.阅读21h。第一,精读《社会性动物》,有些内容和《态度改变与社会影响》、《思考,快与慢》想通,读起来很顺畅。第二,翻看《夏商周:从神话到史实》以及《汉字就是这么来的》。2.写作3.5h。保持日更。3.语言学习5h。I.粤语学习方面。上周模仿了电视剧《新四十二章经》,在工作中和同事用粤语交流,II.英语学习方面。每天至少听写或翻译一篇,跟读电影扎导版《正义联盟》。4.PPT学习3.5h
华为服务器2258X V5裸机安装Ubuntu及配置
ghsshou
ubuntu服务器华为
2258XV5基本信息配置信息:型号2288XV5BIOS版本:8.02/ReleaseDate:04/14/2021处理器型号:Intel®Xeon®
[email protected]版本:6.27RAID控制卡型号:AdaptecSmartRAID3152-8i准备申请固定IP将服务器管理口、远程登录口连接交换机下载镜像:检查一下兼容性:https://support-it.hu
ADC模块在电路中的存在形式与主控(MCU)的关系
、我是男生。
单片机嵌入式硬件
四、ADC模块在电路中的存在形式与主控(MCU)的关系这是电子工程师必须彻底理解的要点!ADC的存在形式主要有三种:独立ADC芯片(DiscreteADCIC):存在形式:一个单独的物理芯片(如TIADS1248,ADIAD7799)。与MCU关系:ADC芯片完成模拟信号采样、保持、量化、编码的全部工作。MCU通过数字通信接口(SPI,I2C,Parallel)向ADC发送控制命令(启动转换、选择
【计算机体系结构】相关
南方者
1.相关是导致流水线冲突的主要原因。2.相关①两条指令之间存在某种依赖关系。②如果两条指令相关,则他们就有可能不能在流水线中重叠执行或者只能部分重叠执行。3.三类相关有:数据相关(真数据相关)、名相关、控制相关数据相关对于两条指令i(前一条指令)和j(后一条指令),如果在以下条件之一成立,则称指令j和指令i数据相关。1.指令j使用指令i产生的结果2.指令j与指令k数据相关,指令k又与指令i数据相关
R语言基础语法及示例
路飞VS草帽
R语言R语言
1.变量赋值在R中,可以使用5){print("x大于5")}else{print("x小于或等于5")}#输出:[1]"x大于5"8.循环使用for和while进行循环。r#for循环for(iin1:5){print(i)}#输出:#[1]1#[1]2#[1]3#[1]4#[1]5#while循环i<-1while(i<=5){print(i)i<-i+1}#输出:#[1]1#[1]2#[1]
不要浪费每一分钟
凝飞呀
图片发自App图片发自App图片发自AppDon'twasteagoddamnminute,'causeyouneverknowwhenyourtimeisup.不要浪费每一分钟,因为你不知道什么时候你就没时间了。
射影几何与度量几何(二+)
现在开始发呆
用二维几何说明克莱因的思想:在射影平面内选取一个二次曲线为绝对形,要推导罗氏几何,二次曲线必须是实的,即其平面齐次坐标方程为,对正的常曲率曲面上的黎曼几何来说,二次曲线是虚的,如,对欧氏几何,二次曲线退化为两个重合直线,齐次坐标用x3=0表示,在此轨迹上选取两个虚点,其方程为,即无穷远点,它的齐次坐标为(1,i,0)和(1,-i,0)。在各种情况下的二次曲线都是实方程。设二次曲线如下图,P1,P2
算法:floyd和高精度 洛谷 最短路 P1037 [NOIP 2002 普及组] 产生数
健仙
算法算法数据结构c++
思路:因为某个数变成另一个数是单向的,并且一个数变成另一个数后还可以变,让我联想到图论的内容,一个数变成其他数就相当于这个数与另一个数有单向边,而且边之间的线路可以让一个数可能变成很多数,因为数据量很小,我就想到了floyd,就是我们用floyd做传递闭包,得出一个数可以变成哪些数,然后将每个位看一遍,乘起来就是答案,不过这里有个小坑,答案超过了2的64次方,所以还要高精度算法处理一下。代码:#i
2025全球远程IO模块品牌盘点:十大领先品牌推荐
2501_91398178
IO模块分布式IO无线IO模块远程IO模块IO采集模块
随着工业自动化和物联网(IoT)的快速发展,远程IO模块在工业控制、智能制造、楼宇自动化和能源管理等领域中扮演着不可或缺的角色。远程IO模块通过将物理信号(如温度、压力、开关状态等)转换为数字信号并上传至控制系统,实现了对设备的远程监控和控制。在2025年,全球远程IO模块市场竞争日趋激烈,技术创新和产品可靠性成为行业发展的核心动力。本文基于Statista、MarketsandMarkets和I
算法竞赛备赛——【图论】求最短路径——Floyd算法
Aurora_wmroy
算法竞赛备赛算法图论c++蓝桥杯数据结构
floyd算法基于动态规划应用:求多源最短路时间复杂度:n^3dijkstra:不能解决负边权floyd:能解决负边权不能解决负边权回路问题求最短路径:dijkstrabfsfloyd思路1.让任意两点之间的距离变短:引入中转点k通过k来中转i---->k---->jj2.找状态:n个点都可以做中转点的情况下,i到j之间的最短路径的长度是x最终状态:dp[n][i][j]=x;中间状态:dp[k]
46. 携带研究材料(01背包二维数组) 46. 携带研究材料(01背包一维数组)LeetCode 416. 分割等和子集 Leetcode 1049. 最后一块石头的重量II
Tiny番茄
算法动态规划
46.携带研究材料(01背包二维数组)题目是给定一个物品的重量数组weight,和物品对应的价值数组value。另外给了背包需要装多少种物品,和背包的容量(即输入两个数组+背包所考虑的物品种类category和背包的容量bagweight)dp数组的定义,下标表示什么含义。dp[i][j]表示容量为j的背包从编号[0,i]之间选取物品进行存放所能达到的最大价值。其中,横轴上的坐标可以考虑为是背包的
爬楼梯——动态规划
不吃鱼的猫
算法动态规划算法leetcode
文章目录题目一解法一:动态规划题目二解法:题目一假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?解法一:动态规划将dp[i]数组定义为到达第i阶楼梯有多少种方法,由每次可以爬1或2阶可以得到递推公式:dp[i]=dp[i−1]+dp[i−2]dp[i]=dp[i-1]+dp[i-2]dp[i]=dp[i−1]+dp[i−2]其中,dp[i-1
动态规划之爬楼梯
LeetCode地址:爬楼梯假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定n是一个正整数。示例1:输入:2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:3输出:3解释:有三种方法可以爬到楼顶。-1阶+1阶+1阶-1阶+2阶-2阶+1阶第一种方法动态规划1.确定dp数组dp[i]爬到第i层楼梯,有dp[i
到底如何从零开始使用Hyperf 搭建微服务架构?具体步骤是怎样的?底层原理是什么?
一、Hyperf的底层原理Hyperf是一个基于Swoole的高性能PHP微服务框架,其核心特点包括:协程支持:基于Swoole提供的协程能力,Hyperf实现了非阻塞I/O和高并发处理。协程是轻量级线程,允许在单个进程中处理大量并发请求。依赖注入(DI):使用PSR-11标准的依赖注入容器,简化组件管理和服务解耦。AOP(面向切面编程):通过注解和AOP机制,可以在方法执行前后插入逻辑,例如日志
开发者关心的那些事
圣子足道
ios游戏编程apple支付
我要在app里添加IAP,必须要注册自己的产品标识符(product identifiers)。产品标识符是什么?
产品标识符(Product Identifiers)是一串字符串,它用来识别你在应用内贩卖的每件商品。App Store用产品标识符来检索产品信息,标识符只能包含大小写字母(A-Z)、数字(0-9)、下划线(-)、以及圆点(.)。你可以任意排列这些元素,但我们建议你创建标识符时使用
负载均衡器技术Nginx和F5的优缺点对比
bijian1013
nginxF5
对于数据流量过大的网络中,往往单一设备无法承担,需要多台设备进行数据分流,而负载均衡器就是用来将数据分流到多台设备的一个转发器。
目前有许多不同的负载均衡技术用以满足不同的应用需求,如软/硬件负载均衡、本地/全局负载均衡、更高
LeetCode[Math] - #9 Palindrome Number
Cwind
javaAlgorithm题解LeetCodeMath
原题链接:#9 Palindrome Number
要求:
判断一个整数是否是回文数,不要使用额外的存储空间
难度:简单
分析:
题目限制不允许使用额外的存储空间应指不允许使用O(n)的内存空间,O(1)的内存用于存储中间结果是可以接受的。于是考虑将该整型数反转,然后与原数字进行比较。
注:没有看到有关负数是否可以是回文数的明确结论,例如
画图板的基本实现
15700786134
画图板
要实现画图板的基本功能,除了在qq登陆界面中用到的组件和方法外,还需要添加鼠标监听器,和接口实现。
首先,需要显示一个JFrame界面:
public class DrameFrame extends JFrame { //显示
linux的ps命令
被触发
linux
Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。
要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行
Android 音乐播放器 下一曲 连续跳几首歌
肆无忌惮_
android
最近在写安卓音乐播放器的时候遇到个问题。在MediaPlayer播放结束时会回调
player.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
Log.i("H
java导出txt文件的例子
知了ing
javaservlet
代码很简单就一个servlet,如下:
package com.eastcom.servlet;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.Resu
Scala stack试玩, 提高第三方依赖下载速度
矮蛋蛋
scalasbt
原文地址:
http://segmentfault.com/a/1190000002894524
sbt下载速度实在是惨不忍睹, 需要做些配置优化
下载typesafe离线包, 保存为ivy本地库
wget http://downloads.typesafe.com/typesafe-activator/1.3.4/typesafe-activator-1.3.4.zip
解压r
phantomjs安装(linux,附带环境变量设置) ,以及casperjs安装。
alleni123
linuxspider
1. 首先从官网
http://phantomjs.org/下载phantomjs压缩包,解压缩到/root/phantomjs文件夹。
2. 安装依赖
sudo yum install fontconfig freetype libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6
3. 配置环境变量
vi /etc/profil
JAVA IO FileInputStream和FileOutputStream,字节流的打包输出
百合不是茶
java核心思想JAVA IO操作字节流
在程序设计语言中,数据的保存是基本,如果某程序语言不能保存数据那么该语言是不可能存在的,JAVA是当今最流行的面向对象设计语言之一,在保存数据中也有自己独特的一面,字节流和字符流
1,字节流是由字节构成的,字符流是由字符构成的 字节流和字符流都是继承的InputStream和OutPutStream ,java中两种最基本的就是字节流和字符流
类 FileInputStream
Spring基础实例(依赖注入和控制反转)
bijian1013
spring
前提条件:在http://www.springsource.org/download网站上下载Spring框架,并将spring.jar、log4j-1.2.15.jar、commons-logging.jar加载至工程1.武器接口
package com.bijian.spring.base3;
public interface Weapon {
void kil
HR看重的十大技能
bijian1013
提升能力HR成长
一个人掌握何种技能取决于他的兴趣、能力和聪明程度,也取决于他所能支配的资源以及制定的事业目标,拥有过硬技能的人有更多的工作机会。但是,由于经济发展前景不确定,掌握对你的事业有所帮助的技能显得尤为重要。以下是最受雇主欢迎的十种技能。 一、解决问题的能力 每天,我们都要在生活和工作中解决一些综合性的问题。那些能够发现问题、解决问题并迅速作出有效决
【Thrift一】Thrift编译安装
bit1129
thrift
什么是Thrift
The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and s
【Avro三】Hadoop MapReduce读写Avro文件
bit1129
mapreduce
Avro是Doug Cutting(此人绝对是神一般的存在)牵头开发的。 开发之初就是围绕着完善Hadoop生态系统的数据处理而开展的(使用Avro作为Hadoop MapReduce需要处理数据序列化和反序列化的场景),因此Hadoop MapReduce集成Avro也就是自然而然的事情。
这个例子是一个简单的Hadoop MapReduce读取Avro格式的源文件进行计数统计,然后将计算结果
nginx定制500,502,503,504页面
ronin47
nginx 错误显示
server {
listen 80;
error_page 500/500.html;
error_page 502/502.html;
error_page 503/503.html;
error_page 504/504.html;
location /test {return502;}}
配置很简单,和配
java-1.二叉查找树转为双向链表
bylijinnan
二叉查找树
import java.util.ArrayList;
import java.util.List;
public class BSTreeToLinkedList {
/*
把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \
Netty源码学习-HTTP-tunnel
bylijinnan
javanetty
Netty关于HTTP tunnel的说明:
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/socket/http/package-summary.html#package_description
这个说明有点太简略了
一个完整的例子在这里:
https://github.com/bylijinnan
JSONUtil.serialize(map)和JSON.toJSONString(map)的区别
coder_xpf
jqueryjsonmapval()
JSONUtil.serialize(map)和JSON.toJSONString(map)的区别
数据库查询出来的map有一个字段为空
通过System.out.println()输出 JSONUtil.serialize(map): {"one":"1","two":"nul
Hibernate缓存总结
cuishikuan
开源sshjavawebhibernate缓存三大框架
一、为什么要用Hibernate缓存?
Hibernate是一个持久层框架,经常访问物理数据库。
为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。
缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
二、Hibernate缓存原理是怎样的?
Hibernate缓存包括两大类:Hib
CentOs6
dalan_123
centos
首先su - 切换到root下面1、首先要先安装GCC GCC-C++ Openssl等以来模块:yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel2、再安装ncurses模块yum -y install ncurses-develyum install ncurses-devel3、下载Erang
10款用 jquery 实现滚动条至页面底端自动加载数据效果
dcj3sjt126com
JavaScript
无限滚动自动翻页可以说是web2.0时代的一项堪称伟大的技术,它让我们在浏览页面的时候只需要把滚动条拉到网页底部就能自动显示下一页的结果,改变了一直以来只能通过点击下一页来翻页这种常规做法。
无限滚动自动翻页技术的鼻祖是微博的先驱:推特(twitter),后来必应图片搜索、谷歌图片搜索、google reader、箱包批发网等纷纷抄袭了这一项技术,于是靠滚动浏览器滚动条
ImageButton去边框&Button或者ImageButton的背景透明
dcj3sjt126com
imagebutton
在ImageButton中载入图片后,很多人会觉得有图片周围的白边会影响到美观,其实解决这个问题有两种方法
一种方法是将ImageButton的背景改为所需要的图片。如:android:background="@drawable/XXX"
第二种方法就是将ImageButton背景改为透明,这个方法更常用
在XML里;
<ImageBut
JSP之c:foreach
eksliang
jspforearch
原文出自:http://www.cnblogs.com/draem0507/archive/2012/09/24/2699745.html
<c:forEach>标签用于通用数据循环,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的最后一个项目 step 步长 否 1
Android实现主动连接蓝牙耳机
gqdy365
android
在Android程序中可以实现自动扫描蓝牙、配对蓝牙、建立数据通道。蓝牙分不同类型,这篇文字只讨论如何与蓝牙耳机连接。
大致可以分三步:
一、扫描蓝牙设备:
1、注册并监听广播:
BluetoothAdapter.ACTION_DISCOVERY_STARTED
BluetoothDevice.ACTION_FOUND
BluetoothAdapter.ACTION_DIS
android学习轨迹之四:org.json.JSONException: No value for
hyz301
json
org.json.JSONException: No value for items
在JSON解析中会遇到一种错误,很常见的错误
06-21 12:19:08.714 2098-2127/com.jikexueyuan.secret I/System.out﹕ Result:{"status":1,"page":1,&
干货分享:从零开始学编程 系列汇总
justjavac
编程
程序员总爱重新发明轮子,于是做了要给轮子汇总。
从零开始写个编译器吧系列 (知乎专栏)
从零开始写一个简单的操作系统 (伯乐在线)
从零开始写JavaScript框架 (图灵社区)
从零开始写jQuery框架 (蓝色理想 )
从零开始nodejs系列文章 (粉丝日志)
从零开始编写网络游戏 
jquery-autocomplete 使用手册
macroli
jqueryAjax脚本
jquery-autocomplete学习
一、用前必备
官方网站:http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/
当前版本:1.1
需要JQuery版本:1.2.6
二、使用
<script src="./jquery-1.3.2.js" type="text/ja
PLSQL-Developer或者Navicat等工具连接远程oracle数据库的详细配置以及数据库编码的修改
超声波
oracleplsql
在服务器上将Oracle安装好之后接下来要做的就是通过本地机器来远程连接服务器端的oracle数据库,常用的客户端连接工具就是PLSQL-Developer或者Navicat这些工具了。刚开始也是各种报错,什么TNS:no listener;TNS:lost connection;TNS:target hosts...花了一天的时间终于让PLSQL-Developer和Navicat等这些客户
数据仓库数据模型之:极限存储--历史拉链表
superlxw1234
极限存储数据仓库数据模型拉链历史表
在数据仓库的数据模型设计过程中,经常会遇到这样的需求:
1. 数据量比较大; 2. 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等; 3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态, 比如,查看某一个用户在过去某一段时间内,更新过几次等等; 4. 变化的比例和频率不是很大,比如,总共有10
10点睛Spring MVC4.1-全局异常处理
wiselyman
spring mvc
10.1 全局异常处理
使用@ControllerAdvice注解来实现全局异常处理;
使用@ControllerAdvice的属性缩小处理范围
10.2 演示
演示控制器
package com.wisely.web;
import org.springframework.stereotype.Controller;
import org.spring