取模运算与除法运算区别
除法和取余(模运算)在数学中是密切相关的运算。在整数除法中,比如5除以3,结果是1余2。这里的1是商,2是余数。
在C++等编程语言中,除法运算符(/)用来求商,模运算符(%)用来求余数。
所以,5 / 3 的结果是 1,5 % 3 的结果是 2。
取模重要用途:循环索引
在C++中,取余(或称为取模)操作有很多用途。大多数用途,是用于环形数组之中,通过取模%运算循环遍历数组!
由于取模运算的特性, i初始值=0,那么i%nums.size()
这个式子就是0--nums.size()-1
循环取值。
- 当i初始值=0时,i%a的范围就是[0,a-1]!
因为 “求模” 运算的定义是 “求余数”。例如,当 7 除以 3,结果是 2 余 1,所以 7%3 的结果是 1。余数总是会小于除数的,所以 i%a 的结果将始终在 0 到 a-1 的范围内。
当 i 小于 a 时,i%a 的结果就是 i 自己;当 i 等于 a 时,i%a 的结果就是 0;当 i 大于 a 时,i%a 的结果就是 i-a 的值,直到这个值小于 a 为止。
循环索引示例
本题是环形数组,需要遍历两遍原来的nums数组,才能得到环形数组每个元素的下一个最大元素。
遍历两遍的逻辑:
st.push(0);
for(int i=1;i<nums.size()*2;i++){
if(nums[i%nums.size()]<=nums[st.top()]){
st.push(i%nums.size());
}
else{
while(nums[i%nums.size()]>nums[st.top()]&&!st.empty()){
result