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;
}
}