看见了一道二维数组找数的题,已排好序的数组(从左至右从上到下,都是由小变大的)让找数,瞬间就出思路了,并没有必要去看他的解释,两次二分就搞定了。
#include<cstdio> #include<iostream> using namespace std; void sreach(int num[][100], int row, int line, int goal) { int i=0,j=row-1,mid; while((j-i)>1) { mid=(i+j)/2; if(num[mid][0]>goal) j=mid; else i=mid; } int a,b; a = goal>=num[j][0] ? j : i; i=0,j=line-1; while((j-i)>1) { mid=(i+j)/2; if(num[a][mid]>goal) j=mid; else i=mid; }
if(num[a][b]!=goal){
cout<<"not found!"<<endl;
}
else cout<<a<<","<<b<<endl;
} int main() { int n,m; int number[100][100]; while(scanf("%d%d",&m,&n)) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf("%d",&number[i][j]); int x; cin>>x; sreach(number, n, m, x); } return 0; } /* 6 6 1 2 3 4 5 6 10 12 15 16 18 21 22 23 26 27 29 30 32 33 34 35 36 37 40 41 43 44 47 50 50 51 55 56 57 58 5 5 1 2 3 4 5 10 12 15 16 18 22 23 26 27 29 32 33 34 35 36 40 41 43 44 47 */
还有一道插入字符串,把空格都换成%D%,直接链表搞定,不让用链表就用JAVA的linkedlist写。一个函数就够了。
#include<cstdio> #include<iostream> using namespace std; struct node { char data; node *next; }*root; // 指针没有盘空 void setuplist(char s[]) { node *temp,*n; n=root; int i=0; while(s[i]!='\0') { temp = new node; temp->next=NULL; temp->data=s[i]; n->next=temp; n=temp; i++; } } void insertwords() { node *n; node *temp1,*temp2; n=root->next; while(n->next) { if(n->data==' ') { n->data='%'; temp1 = new node; temp1->data = 'd'; temp2 = new node; temp2->data = '%'; temp1->next=temp2; temp2->next=n->next; n->next=temp1; } else n=n->next; } } void del(node *n) { if(n->next) del(n->next); delete n; } int main() { char s[100]; while(gets(s)) { root = new node; root->next = NULL; setuplist(s); insertwords(); node *t=root->next; while(t->next) { cout<<t->data; t=t->next; } cout<<endl; del(root); } }