using System;using System.Collections.Generic;publicclassDirReduction{publicstatic String[]dirReduc(String[] arr){
Stack<String> stack =newStack<String>();foreach(String direction in arr){String lastElement = stack.Count >0? stack.Peek().ToString():null;switch(direction){case"NORTH":if("SOUTH".Equals(lastElement)){ stack.Pop();}else{ stack.Push(direction);}break;case"SOUTH":if("NORTH".Equals(lastElement)){ stack.Pop();}else{ stack.Push(direction);}break;case"EAST":if("WEST".Equals(lastElement)){ stack.Pop();}else{ stack.Push(direction);}break;case"WEST":if("EAST".Equals(lastElement)){ stack.Pop();}else{ stack.Push(direction);}break;}}
String[] result = stack.ToArray();
Array.Reverse(result);return result;}}
答案2:
using System;using System.Collections.Generic;using System.Linq;publicclassDirReduction{publicstaticstring[]dirReduc(String[] arr){
Dictionary<string,string> oppositeOf =newDictionary<string,string>(){{"NORTH","SOUTH"},{"SOUTH","NORTH"},{"EAST","WEST"},{"WEST","EAST"}};
List<string> betterDirections =newList<string>();foreach(var direction in arr){if(betterDirections.LastOrDefault()== oppositeOf[direction]){
betterDirections.RemoveAt(betterDirections.Count -1);}else{
betterDirections.Add(direction);}}return betterDirections.ToArray();}}
答案3:
using System.Collections.Generic;publicclassDirReduction{publicstaticstring[]dirReduc(string[] arr){var list =newList<string>();
list.AddRange(arr);for(var i =0; i < list.Count -1; i++){if((list[i]== Dir.E && list[i +1]== Dir.W)||(list[i]== Dir.W && list[i +1]== Dir.E)||(list[i]== Dir.N && list[i +1]== Dir.S)||(list[i]== Dir.S && list[i +1]== Dir.N)){
list.RemoveRange(i,2);
i =-1;}}return list.ToArray();}privatestaticclassDir{publicstaticstring N ="NORTH",
E ="EAST",
W ="WEST",
S ="SOUTH";}}
答案4:
using System.Linq;using System.Text.RegularExpressions;publicclassDirReduction{publicstaticstring[]dirReduc(string[] arr){string s=newstring(arr.Select(x=>x[0]).ToArray());while(Regex.Match(s,"NS|EW|SN|WE").Success) s=Regex.Replace(s,"NS|EW|SN|WE","");return s.Select(x=>x=='N'?"NORTH": x=='S'?"SOUTH": x=='E'?"EAST":"WEST").ToArray();}}
答案5:
using System.Collections.Generic;using System.Linq;using System;publicclassDirReduction{conststring NORTH ="NORTH";conststring SOUTH ="SOUTH";conststring EAST ="EAST";conststring WEST ="WEST";publicstaticstring[]dirReduc(String[] arr){
LinkedList<string> result =newLinkedList<string>();foreach(string dir in arr){if(result.Last!=null&& result.Last.Value.Equals(getOpposite(dir))){
result.RemoveLast();}else{
result.AddLast(dir);}}return result.ToArray();}publicstaticstringgetOpposite(string dir){switch(dir){case NORTH:return SOUTH;case SOUTH:return NORTH;case EAST:return WEST;case WEST:return EAST;}return"";}}
答案6:
using System;using System.Collections.Generic;using System.Linq;publicclassDirReduction{publicstaticstring[]dirReduc(string[] arr){var stack =newStack<string>();foreach(var s in arr){PushAndReduce(stack, s);}return stack.Reverse().ToArray();}privatestaticvoidPushAndReduce(Stack<string> stack,string s){if(!stack.Any()||!AreOposite(stack.Peek(), s))
stack.Push(s);else
stack.Pop();}privatestaticboolAreOposite(string peek,string s){switch(peek){case"NORTH":return s =="SOUTH";case"SOUTH":return s =="NORTH";case"EAST":return s =="WEST";case"WEST":return s =="EAST";}thrownewArgumentException();}}
答案7:
using System.Collections.Generic;using System;using System.Linq;publicclassDirReduction{publicstaticstring[]dirReduc(String[] arr){
List<string> arList = arr.ToList();for(int i =1; i < arList.Count ; i++){if((arList[i]=="SOUTH"&& arList[i -1]=="NORTH")||(arList[i]=="NORTH"&& arList[i -1]=="SOUTH")||(arList[i]=="EAST"&& arList[i -1]=="WEST")||(arList[i]=="WEST"&& arList[i -1]=="EAST")){
arList.RemoveRange(i -1,2);
i =0;}}return arList.ToArray();}}
答案8:
using System;using System.Collections.Generic;publicclassDirReduction{publicstaticstring[]dirReduc(String[] arr){int compares =0;
List<string> list =newList<string>(arr);for(int i =0; i < list.Count; i++){if(list.Count - compares ==1)return list.ToArray();if(AreOpposite(list[i], list[i +1])){
list.RemoveAt(i);
list.RemoveAt(i);
i =-1;
compares =0;}else
compares++;}return list.ToArray();}staticboolAreOpposite(string a,string b){return(a =="NORTH"&& b =="SOUTH")||(b =="NORTH"&& a =="SOUTH")||(a =="EAST"&& b =="WEST")||(a =="WEST"&& b =="EAST")?true:false;}}
答案9:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;publicclassDirReduction{privatestaticstring WEST ="WEST";privatestaticstring EAST ="EAST";privatestaticstring SOUTH ="SOUTH";privatestaticstring NORTH ="NORTH";publicstaticstring[]dirReduc(String[] arr){
List<string> reducList =newList<string>();for(int i =0; i < arr.Length; i++){if(i+1== arr.Length){
reducList.Add(arr[i]);continue;}if((arr[i]== WEST && arr[i +1]== EAST)||(arr[i]== EAST && arr[i +1]== WEST)||(arr[i]== SOUTH && arr[i +1]== NORTH)||(arr[i]== NORTH && arr[i +1]== SOUTH)){
i++;}else{
reducList.Add(arr[i]);}}if(arr.Length != reducList.Count())returndirReduc(reducList.ToArray());return reducList.ToArray();}}
答案10:
using System;using System.Linq;using System.Collections.Generic;publicclassDirReduction{publicstaticstring[]dirReduc(string[] arr){var s =string.Join("-", arr);var l =0;while(l != s.Length){
l = s.Length;
s = s.Replace("NORTH-SOUTH",string.Empty).Replace("SOUTH-NORTH",string.Empty).Replace("EAST-WEST",string.Empty).Replace("WEST-EAST",string.Empty).Replace("--","-").Trim('-');}return s.Split('-');}}