是个老题目了,只是想不到怎么做。求数组中大于左边,小于右边的元素,除了首元素和尾元素,如{4,1,2,5,8,6,9} 则输出5;数组中可能不止一个符合条件的元素;
要求用一重for循环做
要求用一重for循环做
解决方案 »
- C#windows控件CheckListBox选项如何水平排布
- C#简单问题··
- 急:GDI+ 绘制曲线或折线遇到的问题
- 请问reportviewer为什么不可以响应鼠标的事件
- 关于System.Runtime.InteropServices.COMException 库没有注册的问题
- 关于Crystal Report数据源的问题
- C# 安装与部署项目中Web引导程序安装文件夹的URL能动态设置吗
- INNO SETUP在安装过程中实现附加数据库
- 想从excel某单元格中读取数据到textBox1里,后面不知道怎么写了?请教!
- HttpWebResponse问题,Urgent...
- 如何用C#批量更改文件名?
- 同一个东西的程序代码,为何有不同了
static void SearchMid(ref int[] a)
{
int Cou=a.Length-1;
int Maxflag=a[0];
for(int i=1;i<Cou;i++)
{
for(;a[i]<=Maxflag&&i<Cou;i++){} //在前i元素中找最大元素
if(i<Cou)
{
for(int j=i+1;a[i]<a[j]&&i<Cou;j++) //向后排查
{
Maxflag=a[j];
if(j==Cou)
{
Console.WriteLine("{0}", a[i]); //输出元素
break;
}
}
if(i<Cou) Maxflag=a[i]; //如果for条件不成立且,
}
}
}
这是我做的,代码太多了
for(int i=1;i<ln-1;i++){
if( arr[i-1]<arr[i] && arr[i]<arr[i+1]){
Console.Write(arr[i]);
}}
for(int i=1;i<ln-1;i++){
if( arr[i-1]<arr[i] && arr[i]<arr[i+1]){
Console.Write(arr[i]);
}}
List<int> b = new List<int>(); for (int i = 0; i < a.Length; i++)
{
if (i != 0 && i != a.Length - 1)
{
if (a[i] > a[i - 1] && a[i] < a[i + 1])
{
b.Add(a[i]);
}
}
}
List<int> lst; for (int i = 1; i < arr.Length - 1; i++)
{
if (arr[i] > arr[i - 1] && arr[i] < arr[i + 1])
{
lst.Add(arr[i]);
}
}
就要这个?
static void Main(string[] args)
{
int[] arr = { 4, 1, 2, 5, 8, 6, 9 };
List<int> lst = new List<int>(); for (int i = 1; i < arr.Length - 1; i++)
{
if (arr[i] > arr[i - 1] && arr[i] < arr[i + 1])
{
lst.Add(arr[i]);
}
}
}
做个嵌套,就可以用一重for循环做
(其实也不算一重for循环了,而且数组大了伤内存)
对应的index = {0,1,2,3,4,5,6}//生成一个数组,存着从左到右最大数的index
int[] arrMax = {0,0,0,3,4,4,6}
//生成一个数组 存着从右到左最小数的index
int[] arrMin = {1,1,2,3,5,5,6}只有index=3 时,他是左边过来最大,右边过来最小思路有点乱,不过要吃饭了,呵呵
2。判断数组%2==0, 则取中间位置两个, 否则, 取中间位置一个。需要for么?
当是所有的时候 有特别大的几率不存在这个数。
当然了 即便是楼主说的这个 也未必有解。
比如全部都是相同的数 或者一个降序的组合 这样的情况是没解的。
namespace test
{
class Program
{
static void Main(string[] args)
{
int [] arr = new int[]{4,1,2,5,8,6,9} ;
int max = arr.Length - 1, count = 0;
for (int i = 1; i < max; i++)
{
if (arr[i] > arr[i - 1] && arr[i] < arr[i + 1])
{
count++;
System.Console.WriteLine(arr[i]);
}
}
if(count == 0)
{
System.Console.WriteLine("没有符合条件的");
}
}
}
}输出:
2
5楼主给分吧
只要求用一重for循环做,我也暂时还没想出来如何实现。
不过ls还没有正确方法啊。
int index = list.FindIndex(delegate(int d) { return de == d; });
if (index > 0 && index < list.Count - 1) return de > list[index - 1] && de < list[index + 1];
return false;
});集合 e 包含了符合条件的数据。(2, 5)不过没用For.
{
int index = list.FindIndex(delegate(int d) { return de == d; }); if (index > 0 && index < list.Count - 1)
{
return ( list.Take<int>(index).Where<int>(delegate(int tmp) { return tmp >= de; }).Count<int>() == 0 &&
list.Skip<int>(index + 1).Where<int>(delegate(int tmp) { return tmp <= de; }).Count<int>() == 0
);
}
return false;
});结果(5)也没用FOR
{
int[] b = (int[])a.Clone();
for (int i = 0; i < a.Length - 1; i++)
{
for (int j = i + 1; j < a.Length; j++)
{
int temp;
if (a[j] < a[i])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (int k = 1; k < a.Length-1; k++)
{
if (a[k] == b[k])
Console.WriteLine(a[k]);
}
}
float[] fs;
List<float> ls=new List<float>();
//
for(int i=0;i<os.Length;i++){
for(int j=0;j<i;j++){
if(os[i]>os[j]) continue;
else break;
for(int k=i;k<os.Length;k++){
if(os[i]<os[k]) continue;
else break;
ls.Add(os[i]);
}
}
}
//
ls.CopyTo(fs);
return fs;
}
float[] fs;
List <float> ls=new List <float>();
//
for(int i=0;i <os.Length;i++){
for(int j=0;j <i;j++){
if(os[i]>os[j]&&j<i-1) continue;
else (os[i]<=os[j]) break;
for(int k=i+1;k <os.Length;k++){
if(os[i] <os[k]&&k<os.Length-2) continue;
else if(os[i]>=os[k]) break;
ls.Add(os[i]);
}
}
}
//
ls.CopyTo(fs);
return fs;
}这样修改一下,楼主觉得如何, 本人到是似乎觉得好象可以了,SORRY,没测试过..
lz, 动态规划的经典模式, 就是有一张表, 保存了我们需要的信息. 使用时可以查表, 不需要每次都得递归/循环. 所以, 经典的动态规划有两个过程:
1. 产生动态规划表.
2. 利用表解决问题.而你的问题, 需要这样两张表:假设数组arr长度为n, i为索引.
max[i]返回0 ~ i这前半截数组中最大元素.
min[i]返回i+1 ~ n这后半截数组中的最小元素.然后解决问题: if arr[i] > max[i-1] && arr[i] < min[i], 则arr[i]为一个解.
如何构造max和min表?max和min表的构造也很简单, 动态规划, 你要利用已保存的表值, 不需要每次全部循环.
min[i] = arr[i] < min[i]? arr[i]:min[i];构造这两张表, 只需要循环一次.
很多动态规划算法中, 你可能看不到"构造表" 这个过程, 那是因为有各种各样的优化措施. 可以优化掉, 但"表"还是存在的.你的这个算法, 动态规划做, 时间复杂度可以是O(n), 你目前的解法是O(n^3).算法关键是思想, 不在于"用了几个for", 而是时间复杂度, 空间复杂度.
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication6 {
class Program {
static void Main( string[] args ) {
float[] os = new float[] { 4, 1, 2, 5, 8, 6, 9 };
var v = Search(os);
foreach (var item in v) {
Console.WriteLine(item);
Console.Read();
}
}
static float[] Search( params float[] os ) {
float[] fs = default(float[]);
List<float> ls = new List<float>();
//
for (int i = 0; i < os.Length; i++) {
for (int j = 0; j < i; j++) {
if (os[i] > os[j] && j < i - 1) continue;
else if (os[i] <= os[j]) break; for (int k = i + 1; k < os.Length; k++) {
if (os[i] < os[k] && k < os.Length - 2) continue;
else if (os[i] >= os[k]) break;
ls.Add(os[i]);
}
}
}
//
fs = new float[ls.Count];
ls.CopyTo(fs);
return fs;
}
}
}
//已经通过测试 输出为 5
#define N 7
void main()
{
int a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);//初始化数组//
for(i=1;i<N-1;i++)
if(a[i]>a[i-1]&&a[i]<a[i+1])//找符合要求的元素并输出//
printf("%d\t",a[i]);
}
呵呵 不知道楼主是不是这个意思 见笑了。
private List<int> Lst = new List<int>();
private void Button1_Click(System.Object sender, System.EventArgs e)
{
Interaction.MsgBox(GetN);
}
private int GetN()
{
Lst.Clear();
Lst.AddRange(Ints);
Lst.Sort();
if (Lst.Count % 2 != 0) {
//当数组数量为偶数时
return Lst((Lst.Count - 1) / 2);
}
else {
//当数组数量为奇数时
return (Lst(Lst.Count / 2) < Lst(Lst.Count / 2 + 1) ? Lst(Lst.Count / 2) : Lst(Lst.Count / 2 + 1));
}
}
{
Interaction.MsgBox(GetN);
}privateint GetN()
{
Lst.Clear();
Lst.AddRange(Ints);
Lst.Sort();if (Lst.Count%2!=0) {//当数组数量为<奇数>时return Lst((Lst.Count-1)/2);
}else {//当数组数量为<偶数>时return (Lst(Lst.Count/2)< Lst(Lst.Count/2+1)? Lst(Lst.Count/2) : Lst(Lst.Count/2+1));
}
}
//这个方法返回的是数组的下标 想得到具体数字 就 return arr[i]
public static int getIndex(int[] arr)
{
int len=arr.length;
for(int i=1;i<len-1;i++)
{//最后一个运算下标为len-1
int left=0,right=i+1;
for(;left<i;left++){
//当前值任意一个左边的值大于它时则提前结束
if(arr[left]>arr[i])
break;
}
if(left<i)continue; //提前结束外层循环
for(;right<len;right++){
//当前值任意一个右边的值小于它时则提前结束
if(arr[right]<arr[i])
break;
}
if(right==len) //此时已经隐含了 left==i
return i;
}
return -1;
}
a[i]>a[i-1]&&a[i] <a[i+1])//对于这个方法,7,8,9,4,9,11,13,12,10
这个数组你能解出来吗
我再实现一下,你看下: int[] arr = {4,1,2,5,8,6,9}; int[] arrMax = {-1,-1,-1,-1,-1,-1,-1};
int[] arrMin = { -1, -1, -1, -1, -1, -1, -1 }; int iMax = arr[0];
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] > iMax)
{
iMax = arr[i];
}
arrMax[i] = iMax;
} int iMin = arr[arr.Length-1];
for (int i = arr.Length - 1; i >= 0;i-- )
{
if (arr[i] < iMin)
{
iMin = arr[i];
}
arrMin[i] = iMin;
} for (int i = 1; i < arr.Length-1; i++)
{
if (arr[i] == arrMax[i] && arr[i] == arrMin[i])
{
MessageBox.Show(arr[i].ToString());
}
}
这是必要条件,不是充分条件。
比如,下面无解,但满足条件的有12345678
位置:0123456789
数值:912345678048楼正解...
也是整体操作的思路,赞一个,
只可惜仍然不符合LZ一重for的要求一重的复杂度是O(n),容易实现的是O(n*n)
着实比较困难啊...
static void Main(string[] args)
{
int[] arr = new int[] { 1,2,9,8,7,6,5,4,3 };
List<int> results = new List<int>(); bool isFindingLeft = true; int index = 1;
int max = index; for (int i = 0; i < max; i++)
{
if (isFindingLeft)
{
if (arr[index] > arr[i])
{
if (i == index - 1)
{
//重新设置索引
max = arr.Length;
i = index; isFindingLeft = false;
}
}
else
{
System.Console.WriteLine("不符合条件的数{0}:\n", arr[index]); //找下一个数
index++;
if (index == arr.Length - 1)
break; //重新设置索引
max = index;
i = -1;
}
}
else
{
if (arr[index] < arr[i])
{
if (i == max - 1)
{
System.Console.WriteLine("符合条件的数{0}:\n", arr[index]);
results.Add(arr[index]);
//找下一个数
index++;
if (index == arr.Length - 1)
break; //重新设置索引
max = index;
i = -1; isFindingLeft = true;
}
}
else
{
System.Console.WriteLine("不符合条件的数{0}:\n", arr[index]); //找下一个数
index++;
if (index == arr.Length - 1)
break; //重新设置索引
max = index;
i = -1; isFindingLeft = true;
}
}
}
}
你把代码COPY了,运行嘛。:Dint[] str = new int[] { 4, 1, 2, 5, 8, 6, 9};List<int> list = str.ToList<int>();IEnumerable <int> e = list.Where <int>(delegate(int de){
//查找当前数据索引值
int index = list.FindIndex(delegate(int d) { return de == d; });
if (index > 0 && index < list.Count - 1)
{
//返回符合条件的数据
return (
//从0到当前索引值的集合中没有大于等于当前值的数据
list.Take <int>(index).Where <int>(delegate(int tmp) { return tmp >= de; }).Count <int>() == 0
&&
//从当前索引值到末尾的集合中没有小于等于当前值的数据
list.Skip <int>(index + 1).Where <int>(delegate(int tmp) { return tmp <= de; }).Count <int>() == 0
);
}
return false;
}); e集合返回: 5;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace middle_large
{
class Program
{
static void Main(string[] args)
{
int n=10;
int[] arr = { 1, 6, 3, 4, 5, 7, 10,9,8,9 };
int[] smaller = new int[n];
int[] bigger = new int[n];
int [] middle_members=new int [n];
int bigger_min;
int smaller_max;
int a;
int i, j, k; for ( i = 1; i < arr.Length; i++)
{
a = -1;
for ( j = i - 1; j >= 0; j--)
{
smaller[j] = arr[j];
}
for ( j = i + 1; j < arr.Length; j++)
{
bigger[j] = arr[j];
}
for (j = 0; j <= i; j++)
{ bigger[j] = arr[i]; }
smaller_max = smaller.Max();
bigger_min = bigger.Min();
for (k = 0; k < smaller.Length; k++)
{
smaller[k] = 0;
}
for (k = 0; k < bigger.Length ; k++)
{
bigger[k] = 0;
}
if (arr[i] >= smaller_max && arr[i] <= bigger_min)
a = arr[i]; Console.WriteLine(a.ToString());
}
// Console.WriteLine(a.ToString ()); }
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace middle_large
{
class Program
{
static void Main(string[] args)
{
int n=10;
int[] arr = { 1, 6, 3, 4, 5, 7, 10,9,8,9 };
int[] smaller = new int[n];
int[] bigger = new int[n];
int [] middle_members=new int [n];
int bigger_min;
int smaller_max;
int a;
int i, j, k;
for ( i = 1; i < arr.Length; i++)
{
a = -1;
// put all members before the relevent member in smaller array
for ( j = i - 1; j >= 0; j--)
{
smaller[j] = arr[j];
}
// put all members after the relevent member in bigger array
for ( j = i + 1; j < arr.Length; j++)
{
bigger[j] = arr[j];
}
// hlep to get correct answer when finding min .. thats mean to get rid of zeros .
for (j = 0; j <= i; j++)
{ bigger[j] = arr[i]; } smaller_max = smaller.Max();
bigger_min = bigger.Min();
// clear the smaller and bigger array for the next loop
for (k = 0; k < smaller.Length; k++)
{
smaller[k] = 0;
}
for (k = 0; k < bigger.Length ; k++)
{
bigger[k] = 0;
}
// if the arr[i] larger(bigger) then all members befor it (smaller.max)
// and smaller then all members after it (bigger.Min) so take it and its the middle number
// and print it out and go to look for the next one.
if (arr[i] >= smaller_max && arr[i] <= bigger_min)
a = arr[i]; Console.WriteLine(a.ToString());
}
// Console.WriteLine(a.ToString ()); }
}
}
for(int i =1;i<arrExample.Length-1;i++){
if(arrExample[i]>arrExample[i-1]&&arrExample[i]<arrExample[i+1]){
arrAdd.Add(arrExample[i]);
}
}
return arrAdd.ToArray();
XXChen2的也非常好,30分
xie_yanke的虽然我不懂这个原理,20分