• 数据结构与算法之美 07 链表


        class Program
        {
            static void Main(string[] args)
            {
                //var a1 = Jose(10, 3, 4);
                //foreach (var item in a1)
                //{
                //    Console.WriteLine(item);
                //}
    
                var strs = new char[] { 'a', 'b', 'c', 'd', };
                var index = Find(strs, 'b');
    
                Console.ReadKey();
            }
            static int Find2(char[] a, char key)
            {
                // 我举2个例子,你可以拿例子走一下代码
                // a = {4, 2, 3, 5, 9, 6} n=6 key = 7
                // a = {4, 2, 3, 5, 9, 6} n=6 key = 6
                if (a == null || a.Length <= 0)
                {
                    return -1;
                }
                int n = a.Length;
                // 这里因为要将a[n-1]的值替换成key,所以要特殊处理这个值
                if (a[n - 1] == key)
                {
                    return n - 1;
                }
                // 把a[n-1]的值临时保存在变量tmp中,以便之后恢复。tmp=6。
                // 之所以这样做的目的是:希望find()代码不要改变a数组中的内容
                char tmp = a[n - 1];
                // 把key的值放到a[n-1]中,此时a = {4, 2, 3, 5, 9, 7}
                a[n - 1] = key;
                int i = 0;
                // while 循环比起代码一,少了i<n这个比较操作
                while (a[i] != key)
                {
                    ++i;
                }
                // 恢复a[n-1]原来的值,此时a= {4, 2, 3, 5, 9, 6}
                a[n - 1] = tmp;
                if (i == n - 1)
                {
                    // 如果i == n-1说明,在0...n-2之间都没有key,所以返回-1
                    return -1;
                }
                else
                {
                    // 否则,返回i,就是等于key值的元素的下标
                    return i;
                }
            }
            // 在数组a中,查找key,返回key所在的位置
            // 其中,n表示数组a的长度
            private static int Find(char[] a, char key)
            {
                // 边界条件处理,如果a为空,或者n<=0,说明数组中没有数据,就不用while循环比较了
                if (a == null || a.Length <= 0)
                {
                    return -1;
                }
                int i = 0;
                // 这里有两个比较操作:i<n和a[i]==key.
                while (i < a.Length)
                {
                    if (a[i] == key)
                    {
                        return i;
                    }
                    ++i;
                }
                return -1;
            }
    
            //从第start人开始计数,以alter为单位循环记数出列,总人数为total 
            public static int[] Jose(int total, int start, int alter)
            {
                int j, k = 0;
                //count数组存储按出列顺序的数据,以当结果返回 
                int[] count = new int[total + 1];
                //s数组存储初始数据 
                int[] s = new int[total + 1];
                //对数组s赋初值,第一个人序号为0,第二人为1,依此下去
                for (int i = 0; i < total; i++)
                {
                    s[i] = i;
                }
                //按出列次序依次存于数组count中 
                for (int i = total; i >= 2; i--)
                {
                    start = (start + alter - 1) % i;
                    if (start == 0)
                        start = i;
                    count[k] = s[start];
                    k++;
                    for (j = start + 1; j <= i; j++)
                        s[j - 1] = s[j];
                }
                count[k] = s[1];
                //结果返回 
                return count;
            }
        }

  • 相关阅读:
    杭电 FatMouse' Trade
    Navicat Report Viewer 设置选项的问题
    用Beyond Compare精确查找文本内容的方法
    Beyond Compare表格比较详解
    Navicat Report Viewer 如何连接到 MySQL 数据库
    Navicat for MySQL 选项设置技巧详解
    Navicat 用什么方法检测 Oracle 数据库安全性
    有哪些好用的比较工具
    Beyond Compare文件比较有哪些方式
    Beyond Compare怎样修改差异文件夹
  • 原文地址:https://www.cnblogs.com/kikyoqiang/p/10505193.html
Copyright © 2020-2023  润新知