精华内容
下载资源
问答
  • 环形数组循环

    2020-07-29 22:29:17
    环形数组循环 给定一个含有正整数和负整数的环形数组nums,如果某个索引中的数k为正数,则向前移动 k个索引,相反如果是负数-k,则向后移动k个索引。因为数组是环形的,所以可以假设最后一个元素的下一个元素是第一...

    环形数组循环

    给定一个含有正整数和负整数的环形数组nums,如果某个索引中的数k为正数,则向前移动 k个索引,相反如果是负数-k,则向后移动k个索引。因为数组是环形的,所以可以假设最后一个元素的下一个元素是第一个元素,而第一个元素的前一个元素是最后一个元素,确定nums中是否存在循环或周期。循环必须在相同的索引处开始和结束并且循环长度>1。此外,一个循环中的所有运动都必须沿着同一方向进行,换句话说,一个循环中不能同时包括向前的运动和向后的运动。

    示例

    输入:[2,-1,1,2,2]
    输出:true
    解释:存在循环,按索引 0 -> 2 -> 3 -> 0 。循环长度为 3 。
    
    输入:[-1,2]
    输出:false
    解释:按索引 1 -> 1 -> 1 ... 的运动无法构成循环,因为循环的长度为 1 。根据定义,循环的长度必须大于 1 。
    
    输入:[-2,1,-1,-2,-2]
    输出:false
    解释:按索引 1 -> 2 -> 1 -> ... 的运动无法构成循环,因为按索引 1 -> 2 的运动是向前的运动,而按索引 2 -> 1 的运动是向后的运动。一个循环中的所有运动都必须沿着同一方向进行。
    

    题解

    /**
     * @param {number[]} nums
     * @return {boolean}
     */
    var circularArrayLoop = function(nums) {
        var n = nums.length;
        var getNext = x => {
            var nextIndex = (x+nums[x])%n;
            return nextIndex >= 0 ? nextIndex : nextIndex+n;
        };
        for(let i=0;i<n;++i) {
            if(nums[i] === 0) continue;
            let slow = i;
            let fast = getNext(i);
            while(nums[slow]*nums[fast] > 0 && nums[fast] * nums[getNext(fast)] > 0){
                if(slow === fast){
                    if(slow === getNext(slow)) break;
                    else return true;
                }
                slow = getNext(slow);
                fast = getNext(getNext(fast));
            }
            let tmp = i;
            let val = nums[tmp];
            while(val * nums[tmp] > 0){
                let k = getNext(tmp);
                nums[tmp] = 0;
                tmp = k;
            }
        }
        return false;
    };
    

    思路

    首先需要解释一下题意,以示例1[2,-1,1,2,2]为例,最开始是索引0值为2,那么索引向前走2步到索引2值为1,继续向前走1步到达索引3值为2,再向前走2步循环索引回到0,所以这完成了一次循环,这里的起始点并不一定是索引0,起始点可以为任意索引位置,其次就是限制条件循环的长度必须大于1以及一个循环中的所有运动都必须沿着同一方向进行。
    本题使用快慢指针来做,快指针每次走两步,慢指针每次走一步,如果能够达成循环那么快慢指针必定会相遇,当然在此处一步与两步指的是移动一个nums[i]的步长,不是移动index+1,首先定义一个n为数组长度以及getNext方法作为取得该点的下一步的索引值,之后遍历数组,根据定义,数组中不能存在0元素,所以以0为标记值进行剪枝,以慢指针指向i,快指针指向下一步的索引,while循环中第一个判断是保证慢指针与快指针指向的数组值符号相同,第二个判断是保证快指针指向的数组值与下一个快指针指向的数组值同号,保证一个循环中的所有运动都必须沿着同一方向进行,之后如果快慢指针相遇,则判断是否循环的长度为1,若循环的长度为1则不符合条件,便继续查找,否则就可以说明该数组中存在循环,之后便是slow指针走一步,fast指针走两部,最后需要剪枝,因为已经遍历过的元素不可能出现在循环当中,所以将以i为索引开始的每一步都置0,用以实现剪枝。

    每日一题

    https://github.com/WindrunnerMax/EveryDay
    

    参考

    https://leetcode-cn.com/problems/circular-array-loop
    
    展开全文
  • 数组循环右移

    千次阅读 2019-09-03 19:07:39
    数组循环右移问题:给定一个长度为n的数组,将其向右循环移动k位得到一个新的数组。要求空间复杂度为O(1)。(此题为LeetCode上的编程题,但是在我遇到多益网络的面试之前我是不知道此题是LeetCode上的,所以当时我并...

            数组循环右移问题:给定一个长度为n的数组,将其向右循环移动k位得到一个新的数组。要求空间复杂度为O(1)。(此题为LeetCode上的编程题,但是在我遇到多益网络的面试之前我是不知道此题是LeetCode上的,所以当时我并不清楚此题的算法)

            例:长度为n=5的数组a的元素为{1,2,3,4,5},将其右移k=3位后得到{3,4,5,1,2}。其移动过程为{1,2,3,4,5}向右移动一位得到{5,1,2,3,4},向右移动两位得到{4,5,1,2,3},则向右移动三位得到{3,4,5,1,2}。由于当时面试之前我并没有见过此题,所以一时半会想不到算法,但之后发现此题并不难,完全可以看做普通的数组逆序来处理。循环右移k位,则数组中前n-k个元素会被移动,同时数组中最后k位的元素将会被移动到数组开始的位置。那么我们可以将原始数组分为两部分进行单独处理,先将数组中前n-k个元素进行逆序,之后再将最后的k个元素进行逆序,最后将整个数组再进行一次逆序即可。这样的话,其对应的代码为:

    #include <stdio.h>
    void Right_Move(int a[], int n, int k)
    {
        while (n < k)
        {
    	int temp = a[n];
    	a[n] = a[k];
    	a[k] = temp;
    	n++;
    	k--;
        }
    }
    int main()
    {
        int a[] = { 1, 2, 3, 4, 5 };
        int len = sizeof(a) / sizeof(a[0]);
        printf("原始数组为:\n");
        for (int i = 0; i < len; i++)
        {
    	printf("%d ", a[i]);
        }
        printf("\n");
        int k = 3;
        Right_Move(a, 0, len - k - 1);
        Right_Move(a, len - k, len - 1);
        Right_Move(a, 0, len -  1);
        printf("循环右移%d位后:\n", k);
        for (int i = 0; i < len; i++)
        {
    	printf("%d ", a[i]);
        }
        printf("\n");
        return 0;
    }

    展开全文
  • .NET-数组中的数组循环遍历

    千次阅读 2017-11-03 13:39:15
    .NET-数组中的数组循环遍历
    static void Main(string[] args)
            {
                int[][] arr = new int[3][];
                arr[0] = new int[] { 1,2,3};
                arr[1] = new int[] { 4,5 };
                arr[2] = new int[] { 6 };
                foreach(int[] i in arr)
                {
                    foreach(int j in i)
                    {
                        Console.WriteLine(j);
                    }
                }
                for (int i= 0;i < arr.GetLength(0); i++){
                    for(int j = 0; j < arr[i].Length; j++)
                    {
                        Console.WriteLine(arr[i][j]);
                    }
                }
            }
    展开全文
  • C# 数组 循环结构

    千次阅读 2019-06-01 17:42:34
    c# 数组 循环结果数组为什么要使用数组?举个例子:斐波纳西数列生成一些随机数获取数组中前两个最大的数求 1/2 + 2/3 + 。。。。+ 98/99 + 99/100C#预处理命令list集合在循环中 break 和 continue的使用 数组 为...

    数组

    为什么要使用数组?

    举个例子:斐波纳西数列

    1,2,3,5,8,13,21,,,,

                //产生斐波纳西数列
                const int N = 50;//可以用常量来存储要产生斐波纳西数列的个数,要修改个数时直接在这里修改即可
                //int[] a = new int[N];//int类型的存储范围扛不住50个斐波纳西数列
                long[] a = new long[N];
                a[0] = 1;//数组下标从0开始
                a[1] = 2;
                使用while循环/
                Console.WriteLine("while循环:");
                int i = 2;
                while(i < N)
                {
                    a[i] = a[i - 1] + a[i - 2];
                    i++;
                }
                //输出产生的斐波纳西数列
                i = 0;
                while(i < N)
                {
                    Console.WriteLine(a[i]);
                    i++;
                }
                使用for循环 for循环是数组标配/
                Console.WriteLine("使用for循环");
                a = new long[N];
                a[0] = 1;
                a[1] = 2;
                for(int j = 2; j < N; j++)
                {
                    a[j] = a[j - 1] + a[j - 2];
                }
                for (int j = 0; j < N; j++)
                {
                    Console.WriteLine(a[j]);
                }
    

    还有一个foreach(long x in a)循环,会遍历整个a数组,x就是a中的元素,这种循环比较适合集合使用。
    数组一般使用for循环,因为foreach不能控制数组下标范围。

    生成一些随机数

    使用Random()类

                //生成一些随机数
                const int N = 50;
                long[] a = new long[N];
                var r = new Random();
                for(int i = 0; i < N; i++)
                {
                    a[i] = r.Next() % 10;//Next()会产生非负数的int范围内的随机数,%10取余可得到0——9
                }
                foreach(int x in a)
                {
                    Console.WriteLine(x);
                }
    

    Random() 的 next()还可以设置取值范围的。如
    next(0, 10);//0-9随机数
    next(50);// 0—49随机数

    获取数组中前两个最大的数

    方法1:

                //生成一些随机数,输出最大两个数
                const int N = 50;
                long[] a = new long[N];
                var r = new Random();
                for(int i = 0; i < N; i++)
                {
                    a[i] = r.Next(20);//Next()会产生非负数的int范围内的随机数,%10取余可得到0——9
                }
                long max1 = 0;//设置为最小数0
                long max2 = 0;
                foreach(long x in a)
                {
                    Console.WriteLine(x);
                    if(x >= max1)
                    {
                        max1 = x;
                    }else if(x > max2)
                    {
                        max2 = x;
                    }
                }
                Console.WriteLine("max1:{0}, max2:{1}", max1, max2);
    

    方法二:排序后输出

               //生成一些随机数,输出最大两个数
                const int N = 10;
                long[] a = new long[N];
                var r = new Random();
                for(int i = 0; i < N; i++)
                {
                    a[i] = r.Next(10);//Next()会产生非负数的int范围内的随机数,%10取余可得到0——9
                    Console.WriteLine(a[i]);
                }
                //对数组a进行排序
                Console.WriteLine("排序之后:");
                for(int i = 0; i < N; i++)
                {
                    for (int j = i + 1; j < N; j++)
                    {
                        if (a[i] < a[j])
                        {
                            //交换
                            var t = a[i];
                            a[i] = a[j];
                            a[j] = t;
                        }
                    }
                    Console.WriteLine(a[i]);
                }
                Console.WriteLine("max1:{0}, max2:{1}", a[0], a[1]);
            }
    
    求 1/2 + 2/3 + 。。。。+ 98/99 + 99/100
                //解决一个数学问题:1/2 + 2/3 + 。。。。。+ 99/100
                /使用数组///
                double[] a = new double[100];
                for(int i = 0; i < 100; i++)
                {
                    a[i] = i + 1;
                }
                double sum = 0;
                for(int i = 1; i < 100; i++)
                {
                    sum += a[i - 1] / a[i];
                }
                Console.WriteLine("使用数组:" + sum);
                不使用数组//
                sum = 0;
                for(int i = 1; i < 100; i++)
                {
                    sum += (double)i / (i + 1);
                }
                Console.WriteLine("不使用数组:" + sum);
    
    C#预处理命令

    形成代码块,可展开收起。

    #region 代码块名称
    //代码
    #regioned
    
    list集合

    使用起来比数组方便,提供排序、求最值、平均值等方法。

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;//使用计时器
    using System.Linq;
    using System.Text;
    
    namespace basicPractice
    {
        class Program
        {
            static void Main(string[] args)
            {
                //list的使用
                List<int> nums = new List<int>();
                var r = new Random();
                for(int i = 1; i <= 10; i++)
                {
                    nums.Add(r.Next(10));
                }
                foreach(int num in nums)
                {
                    Console.WriteLine(num);
                }
                Console.WriteLine(nums.Max());
                Console.WriteLine(nums.Min());
                Console.WriteLine(nums.Average());
                nums.Sort();
                Console.WriteLine("排序后:");
                foreach(int num in nums)
                {
                    Console.WriteLine(num);
                }
            }
        }
    }
    
    
    在循环中 break 和 continue的使用

    break是跳出循环,执行循环后面的内容;
    continue是跳过本次循环中continue后面的内容,执行下一次循环。

    展开全文
  • 数组循环移位

    千次阅读 2014-04-12 18:02:55
    数组循环移位 提出问题: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 解法一: 我们先试验简单的方法,可以每次将数组中的元素右移一位,循环K次...
  • Java实现 LeetCode 457 环形数组循环

    万次阅读 多人点赞 2020-03-17 22:36:29
    457. 环形数组循环 给定一个含有正整数和负整数的环形数组 nums。 如果某个索引中的数 k 为正数,则向前移动 k 个索引。相反,如果是负数 (-k),则向后移动 k 个索引。因为数组是环形的,所以可以假设最后一个元素的...
  • es6之数组循环

    千次阅读 2019-08-09 10:54:48
    一、回顾es5数组循环 1.arr.forEach()循环 可以接受两个参数: arr.forEach(循环回调函数,this指向谁) arr.forEach(function(){ },arr) 使用箭头函数(不能改变this指向了) arr.forEach((val,index,arr)=>{ ...
  • vue的数组循环和对象循环

    千次阅读 2019-06-27 16:16:12
    数组循环: <!-- item值 index下标 --> <div id="app"> <ol> <li v-for="(item,index) of arr"> {{item}} {{index}} {{item.name}} <!-- item是arr下的对象,取对象下对应值 ...
  • python数组循环处理

    万次阅读 2017-11-10 23:33:25
    本文主要介绍python数组循环语法。主要方式有元素遍历,索引遍历,enumerate, zip, list内部等。 普通循环 list1 = ['item1', 'item2', 'item3'] for item in list1: print(item) //结果 item1 item2 item3 ...
  • 习题2.2 数组循环左移

    千次阅读 2020-02-29 17:59:21
    习题2.2 数组循环左移 这个题很简单,我的思路是将数组的前m个赋值到数组的末尾,然后从第m个开始,输出,就完成了题目的要求。 #include <cstdio> using namespace std; int main() { int n,m; while(~...
  • 数组循环移位 -逆序排列

    千次阅读 2017-08-22 11:05:13
    数组循环移位 -逆序排列
  • 数组循环右移
  • PTA 数组循环左移

    千次阅读 2017-03-08 23:24:26
    习题2.2 数组循环左移 (20分) 本题要求实现一个对数组进行循环左移的简单函数:一个数组aa中存有nn(>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移mm(\ge 0≥0)个位置,即将aa中的数据...
  • 数组循环左移(简单方法)

    千次阅读 2020-10-26 12:35:45
    数组循环左移        本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,...
  • C语言学习笔记——指针数组循环 指针数组循环 举例在函数中的使用 int numJewelsInStones(char * J, char * S){ int i,j,cnt=0; for(i=0;*(S+i)!='\0';i++) { for(j=0;*(J+j)!='\0';j++) if(S[i]==J[j])cnt++; ...
  • //把一个数组循环右移k位 public static void reverse(int[] arr,int b,int e){ for(;b&lt;e;b++,e--){ int tmp=arr[e]; arr[e]=arr[b]; arr[b]=tmp; } } public static void shiftK(int[] a...
  • 【(重点)数组循环遍历的四种方式】 1、使用for循环遍历数组 conut($arr);用于统计数组元素的个数。 for循环只能用于遍历,纯索引数组!!!! 如果存在关联数组,count统计时会统计两种数组的总个数,使用for循环...
  • 1.数组循环 参数val : 数组元素 , index:元素索引,arr:原数组本身 arr.forEach(function(val,index,arr){ }) // 没有返回值,undefiend let arr = ["red","blue","green"] let...
  • C# 数组循环

    千次阅读 热门讨论 2018-04-16 16:22:50
    前言: 在学习到数组这一块的时候,比较有意思的是我们如何快速的遍历一下数组中的各个元素,下面我就和大家说一说比较适合数组循环。for 循环特点: 可以方便快捷的访问数组中的某一个元素,但是需要注意 ...
  • PTA 数组循环右移 (函数)

    千次阅读 2019-02-23 17:08:08
    数组循环右移 (20 分) 本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(&gt;0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a0a1⋯a​n−1)变换为(an−m⋯a​n−1a​0...
  • 数组循环移位(c++实现)

    千次阅读 2019-05-27 19:32:38
    给定一个数组和正整数n(n小于数组长度),请将此数组循环左移n个位置。 例: 输入:[1,3,5,8,6],3 输出:[8,6,1,3,5] #include<iostream> using namespace std; void reserve(int *a,int l, int r); int ...
  • 数组循环赋值

    2020-05-29 16:01:48
    将一个数组的部分属性循环赋值给另一个数组 方法: let list = onlinedata.leftlist; var column = []; for (let i = 0; i < list.length; i++) { let temp = {}; temp.id = list[i].leftid temp.name = ...
  • 编程之美 2.17 数组循环移位

    千次阅读 2013-11-07 23:15:11
    编程之美 2.17 数组循环移位 把一个含有N个元素的数组循环右移K位, 要求时间复杂度位O(N), 且只允许使用两个附加变量. 解法: 使用逆序方法, 分开两段求逆序, 再整体求逆序. 代码 (GCC 4.7.1): /* * ...
  • 1、n个整数存入一维数组中,将该数组循环移动m位;
  • 数组循环左移或右移(数组翻转)

    千次阅读 2015-05-27 20:43:20
    今天练习了一道编程题:数组翻转或者说是数组循环移动。 例如有数组A:1,2,3,4,5,循环左移动2位变成:3,4,5,1,2。 此题的解法很简单也很巧妙,首先将数组逆置 变为 5 4 3 2 1 ,然后将数组分成两个部分,5,4,3 ...
  • 数组循环移位算法

    千次阅读 2013-04-24 20:57:17
    数组循环右移算法: #include #include int main() {  int len;  int *start;  int *end;  printf("请输入数组个数:");  scanf("%d",&len);  start = (int *)malloc(len*sizeof(int));  end = (int *)mal

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,905
精华内容 31,562
关键字:

数组循环